选择具有累积总和的两个日期之间的日期和值

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);

【讨论】:

以上是关于选择具有累积总和的两个日期之间的日期和值的主要内容,如果未能解决你的问题,请参考以下文章

找到两个日期之间的金额总和

两个日期之间实体属性的核心数据总和

获取不同记录的总和并在两个日期范围之间进行比较

日期时间范围之间的 Python Pandas 累积列

=ArrayFormula 使用 SumIf 函数在 Google 表格中的两个日期之间求和

从同一个累积事实表中分离和独立的计数