选择具有累积总和的两个日期之间的日期和值
Posted
技术标签:
【中文标题】选择具有累积总和的两个日期之间的日期和值【英文标题】:Select date and value between two dates with cumulative sum 【发布时间】:2020-05-27 02:50:53 【问题描述】:我正在尝试对两个日期之间的每一天进行求和,而不会丢失最后一个值。
一点上下文:
2020-02-03 have 27 registers
2020-02-04 have 32 registers
2020-02-05 have 28 registers and so on...
所以我做了这个查询:
set @CumulativeSum := 0;
select date(t1.created_at), (@CumulativeSum := @CumulativeSum +
(select count(*)
from services_aux t2
where date(t2.created_at) = date(t1.created_at))) as value
from services_aux t1
where (t1.created_at BETWEEN '2020-02-01' AND '2020-02-07')
group by date(t1.created_at)
第一个结果是可以的,但是总和是错误的。我得到了:
date | value
------------------
2020-02-03 | 27
2020-02-04 | 761
2020-02-05 | 1781
但我希望:
date | value
------------------
2020-02-03 | 27
2020-02-04 | 59
2020-02-05 | 87
【问题讨论】:
见meta.***.com/questions/333952/… 【参考方案1】:如果您运行的是 mysql 8.0,只需使用窗口函数,正如 Tim Biegeleisen 所演示的那样。
在早期版本中,用户变量比大型数据集上的相关子查询更有效。但是它们使用起来有点棘手。一方面,您不需要子查询。并且需要一个小技巧来正确管理总和的排序。我会将您的查询表述为:
set @cnt := 0;
select created_day, @cnt := @cnt + cnt as value
from (
select date(t1.created_at) created_day, count(*) cnt
from services_aux t1
where t1.created_at between '2020-02-01' and '2020-02-07'
group by date(t1.created_at)
order by created_day
) t
【讨论】:
成功了!谢谢。【参考方案2】:在 MySQL 中使用用户变量进行查询可能很棘手。如果您使用的是 MySQL 8+,那么我们可以使用 COUNT
作为解析函数:
SELECT
DATE(created_at) AS created_at,
COUNT(*) OVER (ORDER BY DATE(created_at)) cnt
FROM services_aux
WHERE
created_at BETWEEN '2020-02-01' AND '2020-02-07'
GROUP BY
DATE(created_at);
如果您使用的是早期版本,那么我建议您只使用相关子查询来查找滚动计数:
SELECT
DATE(sa1.created_at) AS created_at,
(SELECT COUNT(*) FROM services_aux sa2
WHERE DATE(sa2.created_at) <= DATE(sa1.created_at)) cnt
FROM services_aux sa1
WHERE
sa1.created_at BETWEEN '2020-02-01' AND '2020-02-07'
GROUP BY
DATE(sa1.created_at);
【讨论】:
以上是关于选择具有累积总和的两个日期之间的日期和值的主要内容,如果未能解决你的问题,请参考以下文章