每月按日志分组总计

时间:2018-01-23 17:51:37

标签: mysql sql-server

我有一个日志表,用于存储act_datetime,app_id,location_id,media_id和media_type_id的媒体请求。我想要的是每个结果集行包含每个月的类型总计。例如,日志记录包含:

enter image description here

我尝试使用临时表按app_id提取记录并按月分组,但每次总计得到多行。我可以使用子查询,但是如何按类型获取每个月的总行数?

非常感谢任何帮助。

谢谢,

布兰登

修改

以下代码结合了共享的想法:

enter image description here

此查询大约需要13秒来解析大约810万行。那可以接受吗?最后,如何将2018-1的日期显示为一列?我在转换为字符串时遇到错误,因为日期也在组中使用,并按子句排序。

我也想尝试代码构造总和(当media_type_id = 1然后1,否则0结束时的情况)......看看是否获得相同的结果和速度。

感谢大家的帮助!

1 个答案:

答案 0 :(得分:0)

假设这是SQL Server,而不是MySQL:

SELECT DATEPART(MONTH, act_datetime) AS [Month],
       COUNT(CASE WHEN app_id = 14 AND media_type_id = 1 AND location_id = 1 THEN act_datetime END) AS MP3_Messages_MO,
       COUNT(CASE WHEN app_id = 14 AND media_type_id = 1 AND location_id = 2 THEN act_datetime END) AS MP3_Messages_FL,
       COUNT(CASE WHEN app_id = 14 AND media_type_id = 3 AND location_id = 1 THEN act_datetime END) AS MP3_Messages_MO,
       COUNT(CASE WHEN app_id = 14 AND media_type_id = 3 AND location_id = 2 THEN act_datetime END) AS MP3_Messages_FL,
       COUNT(CASE WHEN app_id = 55 AND media_type_id = 1 THEN act_datetime END) AS MP3_Music,
       COUNT(CASE WHEN app_id = 55 AND media_type_id = 9 THEN act_datetime END) AS ZIP_Music
FROM YourTable
GROUP BY DATEPART(MONTH, act_datetime);

请注意,您已经包含了不同年份的逻辑,每个月的数据都会计算,无论年份如何。

由于缺少耗材数据,这也完全未经测试。

相关问题