每天的 SQL 计数并在接下来的所有日子里加在一起

Posted

技术标签:

【中文标题】每天的 SQL 计数并在接下来的所有日子里加在一起【英文标题】:SQL count per day and add together all following days 【发布时间】:2016-11-04 15:40:27 【问题描述】:

我正在尝试编写一个 SQL 查询来计算每天的用户数并将结果加在一起。我被卡住了,因为我不知道如何动态地将结果相加。

表:

UserId | CreateDate
-------+----------------------------
  1    | 2016-06-23 13:59:24.0000000
  2    | 2016-06-23 15:59:24.0000000
  3    | 2016-06-24 05:59:24.0000000
  ...

我有以下查询来计算每天的注册人数。

SELECT 
    CONVERT(date, u.CreateDate) as [Date], Count(UserId) as [Count] 
FROM 
    User as u
GROUP BY 
    CONVERT(date, u.CreateDate)
ORDER BY
    [Date]

我不知道如何将结果相加。我希望 SQL Server 2008 R2 有一个适合我的情况的内置函数。还是我需要创建临时表?

假设第 1 天有 2 个注册,第 2 天有 1 个注册,第 3 天有 4 个注册,我希望收到这样的结果:

2016-06-23 | 2
2016-06-24 | 2 + 1 = 3
2016-06-25 | 3 + 4 = 7

我需要一个动态解决方案,因为查询将有另一个日期限制 => 其中 CreateDate 在 x 和 y 之间。

谢谢 鲁埃迪

【问题讨论】:

【参考方案1】:

您可以使用sum窗口函数获取运行总数。

select [Date],sum([Count]) over(order by [Date]) 
from (SELECT CONVERT(date, u.CreateDate) as [Date], Count(UserId) as [Count] 
      FROM User as u
      GROUP BY CONVERT(date, u.CreateDate)
      ) x
order by 1

添加where 子句以过滤内部查询中的特定日期范围。

【讨论】:

应该是SELECT TOP n CONVERT(date, u.CreateDate) as [Date], ... 这行得通,我已经知道 Sum,但我认为这里正在发挥作用。 Over 对我来说是新的,我必须更深入地了解这个功能。谢谢你。我会尽快将您的答案标记为解决方案。你太快了:)【参考方案2】:

使用红移数据库

select [Date],sum([Count]) over(order by [Date] ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) 
from (SELECT CONVERT(date, u.CreateDate) as [Date], Count(UserId) as [Count] 
      FROM User as u
      GROUP BY CONVERT(date, u.CreateDate)
      ) x
order by 1

【讨论】:

您能否在回答中包含逻辑或此代码的工作原理?

以上是关于每天的 SQL 计数并在接下来的所有日子里加在一起的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server:查找学生在自定义日期内的连续缺勤计数

如何获得两天之间的所有日子的数组,并将其显示在一个列表中?

时间序列中的 SQL 滚动计数

sql 在每天结束时关闭不同的计数

如何在 Oracle SQL 中获得过去三天每天的滚动不同计数?

两个日期之间每天未结订单的 SQL 计数