我正在尝试获取表中两个日期之间的变化百分比。我已将数据组合在一起并转换为以下格式,但无法继续获取日期之间的差异。
当前输出:
+------------+---------+--------+
| 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/