在MySQL中运行超过日期的总和

时间:2018-11-17 12:50:06

标签: mysql sql date datetime running-total

我有这张桌子,其中id_user = 7

7    2018-11-12
7    2018-11-12
7    2018-11-13
7    2018-11-13
7    2018-11-13
7    2018-11-13
7    2018-11-14
7    2018-11-15
7    2018-11-15
7    2018-11-15
7    2018-11-15
7    2018-11-15
7    2018-11-16
7    2018-11-16
7    2018-11-16
7    2018-11-16
7    2018-11-16
7    2018-11-16
7    2018-11-16

我想返回用户按天出现的时间以及前几天的累计总和

到目前为止,我已经尝试过...

SELECT COUNT(*)
FROM posts
WHERE id_user='7'
GROUP BY DATE(date) 

预期输出

 day 12/11/2018 > 2 (2)
 day 13/11/2018 > 4 (6)
 day 14/11/2018 > 1 (7)
 day 15/11/2018 > 5 (12)
 day 16/11/2018 > 7 (19)

如何获取括号之间的数字?

1 个答案:

答案 0 :(得分:0)

没有任何窗口函数或用户变量的运行总和要求将表与其自身连接并找出排名低于当前行的行。这是一个昂贵的操作,但比用户变量更可靠。

SELECT main.id_user, main.date, main.c AS today_count, main.c + COUNT(prev.date) AS running_count
FROM (
    SELECT id_user, date, COUNT(*) AS c
    FROM posts
    GROUP BY id_user, date
) AS main
LEFT JOIN posts AS prev ON prev.id_user = main.id_user AND prev.date < main.date
GROUP BY main.id_user, main.date, main.c
ORDER BY main.date DESC

有多种方法可以编写上述查询,有些方法可能比其他方法效率更高,但是希望在更大的数据集上没有奇迹。

Demo on DB Fiddle