繁体   English   中英

每天SQL Server计数消息

[英]SQL Server count message per day

我正在使用SQL Server,并且具有下表:

tbl_Message:
id, date, group_id

这是一个包含消息的表:它的ID,发送日期,发送组。我试图计算每天收到的消息数。 我对此进行了查询,但没有返回没有消息的日子。 查询是:

SELECT DATEADD(MINUTE, DATEDIFF(MINUTE, 0, date)/1440 * 1440,0) AS dateDay,
COUNT(*) AS countMsgDay
FROM tbl_Message
WHERE group_id = 1
GROUP BY DATEADD(MINUTE, DATEDIFF(MINUTE, 0, date)/1440 * 1440,0)

例:

对于tbl_Message

id |     date                 | group_id
----------------------------------------
1  | 2014-10-01 21:04:00.000  | 1
2  | 2014-10-03 21:09:00.000  | 1

查询返回:

dateDay                    | countMsgDay
---------------------------------
2014-10-01 00:00:00.000    | 1
2014-10-03 00:00:00.000    | 1

我想要的是:

dateDay                    | countMsgDay
---------------------------------
2014-10-01 00:00:00.000    | 1
2014-10-02 00:00:00.000    | 0
2014-10-03 00:00:00.000    | 1

解决此问题的正常方法是先生成整天的数据,然后使用left join 您可以通过几种方式生成日期:

  • 使用日历表。
  • 使用递归CTE。
  • 使用数字表。
  • 在查询中明确包含日期。

在某些情况下,有一个更简单的解决方案是条件聚合。 假设每天至少有一个记录。 然后,您可以为此使用条件聚合:

SELECT CAST(date as DATE) as dateDay,
       SUM(CASE WHEN group_id = 1 THEN 1 ELSE 0 END) as countMsgDay
FROM tbl_Message
GROUP BY CAST(date as DATE)
ORDER BY dateDay;

假设每天在表中至少有一条记录,这将对您有用

使用此链接可以在给定日期之间生成日期。 使用start_date作为min(dateDay)和end_date作为max(dateDay)

如何列出两个日期之间的所有日期

现在使用此表并与您的查询联接。 说表派生表是dateRange 因此, select * from dateRange将生成从2014-10-012014-10-03日期。

现在使用如下查询获取所需的输出

select dr.dateval,t.countMsgDay
from dateRange dr
left join
(
    SELECT DATEADD(MINUTE, DATEDIFF(MINUTE, 0, date)/1440 * 1440,0) AS dateDay,
    COUNT(*) AS countMsgDay
    FROM tbl_Message
    WHERE group_id = 1
    GROUP BY DATEADD(MINUTE, DATEDIFF(MINUTE, 0, date)/1440 * 1440,0)
) t
on dr.dateval=t.dateDay

您将需要一个日历表,一旦有了,您需要做的就是对该表使用左连接来获取所有日期。除此以外,日历表还有很多用例

例如:

select 
DATEADD(MINUTE, DATEDIFF(MINUTE, 0, date)/1440 * 1440,0) AS dateDay,
COUNT(*) AS countMsgDay
from 
Calendar c
left join
yourtable t
on t.date=c.date
and group_id = 1
GROUP BY DATEADD(MINUTE, DATEDIFF(MINUTE, 0, date)/1440 * 1440,0)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM