MySQL:获取多个条目的两个日期之间的变化百分比

标签 mysql sql

我正在尝试获取表中两个日期之间的变化百分比。我已将数据组合在一起并转换为以下格式,但无法继续获取日期之间的差异。

当前输出:

+------------+---------+--------+
|    day     | player  | score  |
+------------+---------+--------+
| 2016-12-20 | player1 |  69253 |
| 2016-12-15 | player1 |  61662 |
| 2016-12-15 | player2 | 309180 |
| 2016-12-20 | player2 | 318112 |
| 2016-12-15 | player3 |   1525 |
| 2016-12-20 | player3 |   1405 |
+------------+---------+--------+

预期输出:

+---------+------------+------------+------------+----------+---------------+
| Player  | startDate  |  endDate   | startScore | endScore | percentChange |
+---------+------------+------------+------------+----------+---------------+
| player1 | 2016-12-15 | 2016-12-20 |      61662 |    69253 |        0.8904 |
| player2 | 2016-12-15 | 2016-12-20 |     309180 |   318112 |        0.9719 |
| player3 | 2016-12-15 | 2016-12-20 |       1525 |     1405 |       -0.0854 |
+---------+------------+------------+------------+----------+---------------+

我现在的情况是:

SET @maxDate = (SELECT DATE(from_unixtime(max(timestamp) /1000)) from city_data);
SET @minDate = date_sub(@maxDate, INTERVAL 5 day);

SELECT
    day,
    player,
    sum(score) as score
FROM
(
    SELECT
        DATE(FROM_UNIXTIME(cd.timestamp / 1000)) as day,
        player,
        score
    FROM
        city_data cd
    WHERE
        DATE(FROM_UNIXTIME(cd.timestamp / 1000)) IN(@minDate, @maxDate)
) t
GROUP BY
    day, player

我可以在查询中添加什么以获得所需的输出?我想我们可以假设我的查询结果可以放入临时表中并从那里使用?

编辑:根据请求提供原始表的示例(请注意,这只是一个示例,该表有几百万行)

---------------+--------------+-------+-----+
|   timestamp   |    player    | score |  id |
+---------------+--------------+-------+-----+
| 1477173600000 | player1      |    66 |   1 |
| 1477173600000 | player1      |   654 |   2 |
| 1477173600000 | player1      |     3 |     |
| 1477173600000 | player2      |   238 |   4 |
| 1477173600000 | player2      |  9123 |   5 |
| 1477287798758 | player1      |    69 |   6 |
| 1477287798758 | player1      |   678 |   7 |
| 1477287798758 | player1      |     8 |     |
| 1477287798758 | player2      |   698 |   9 |
| 1477287798758 | player2      | 11000 |  10 |
+---------------+--------------+-------+-----+

最佳答案

假设您需要每天和之前 5 天的分数比较,您可以使用自加入

SELECT t1.player,
       t2.dt as startdate,
       t1.dt as enddate,           
       t2.score as startscore,
       t1.score as endscore,
       (t1.score-t2.score)/(1.0*t1.score) as pct_change
FROM (select player,DATE(FROM_UNIXTIME(timestamp / 1000)) as dt,sum(score) as score from city_data group by player,DATE(FROM_UNIXTIME(timestamp / 1000))) t1
JOIN (select player,DATE(FROM_UNIXTIME(timestamp / 1000)) as dt,sum(score) as score from city_data group by player,DATE(FROM_UNIXTIME(timestamp / 1000))) t2 
ON t1.player=t2.player AND DATE_SUB(t1.dt, INTERVAL 5 day) = t2.dt

如果您需要此结果集中的特定日期,可以使用 where 子句来过滤它们。例如,

SELECT * FROM (
SELECT t1.player,
       t2.dt as startdate,
       t1.dt as enddate,           
       t2.score as startscore,
       t1.score as endscore,
       (t1.score-t2.score)/(1.0*t1.score) as pct_change
FROM (select player,DATE(FROM_UNIXTIME(timestamp / 1000)) as dt,sum(score) as score from city_data group by player,DATE(FROM_UNIXTIME(timestamp / 1000))) t1
JOIN (select player,DATE(FROM_UNIXTIME(timestamp / 1000)) as dt,sum(score) as score from city_data group by player,DATE(FROM_UNIXTIME(timestamp / 1000))) t2 
ON t1.player=t2.player AND DATE_SUB(t1.dt, INTERVAL 5 day) = t2.dt
) x
WHERE startdate = date '2016-12-15' and enddate = date '2016-12-20'

说明:使用派生表获取每个玩家每天的分数总和。加入两次,以便每个玩家的每一天都加入之前 5 天的时间。之后,引用表格并选择所需的值,以便它们位于同一行。

关于MySQL:获取多个条目的两个日期之间的变化百分比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41326252/

相关文章:

java - JPA合并外键丢失

php - 未捕获的异常 'PDOException',消息为“SQLSTATE[42000

使用java的MySQL数据透视表

sql - 检索几个给定日期之前的几个值

sql - 在 SQL 中设计多种类型的支付模式?

mysql - 显示使用 UNION 的查询结果的唯一值( union 返回两列,我想显示一列中的唯一值)

php - 打开网站时CodeIgniter数据库错误

mysql - SELECT NOT IN 来自其他表的两个外键

sql - 如何使用 SQL Server 2008 中的函数生成字母数字随机数

mysql - ADD INDEX 使 MySQL 崩溃