[英]SQL Server : average count of alerts per day, not including days with no alerts
[英]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
。 您可以通过几种方式生成日期:
在某些情况下,有一个更简单的解决方案是条件聚合。 假设每天至少有一个记录。 然后,您可以为此使用条件聚合:
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-01
到2014-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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.