MySQL-获取过去1天、7天和30天的聚合,并允许将记录计数到多个组中
我有一个包含以下数据的表格: 我希望将这些行分为以下几行: 在最后一天内,过去24小时内的一切 在过去7天内,上周内的所有事项 在过去30天内,上个月内 上述行的最终结果如下所示: 我现在可以将记录分组到以下括号中:MySQL-获取过去1天、7天和30天的聚合,并允许将记录计数到多个组中,mysql,sql,Mysql,Sql,我有一个包含以下数据的表格: 我希望将这些行分为以下几行: 在最后一天内,过去24小时内的一切 在过去7天内,上周内的所有事项 在过去30天内,上个月内 上述行的最终结果如下所示: 我现在可以将记录分组到以下括号中: SELECT (CASE WHEN created_at = CURDATE() THEN '1 Day' WHEN created_at >= CURDATE() - INTERVAL 6 DAY THEN '7 Days'
SELECT (CASE WHEN created_at = CURDATE() THEN '1 Day'
WHEN created_at >= CURDATE() - INTERVAL 6 DAY THEN '7 Days'
WHEN created_at >= CURDATE() - INTERVAL 29 DAY THEN '30 Days'
END) AS Timeframe, COUNT(*) AS Count
FROM my_table
GROUP BY (CASE WHEN created_at = CURDATE() THEN '1 Day'
WHEN created_at >= CURDATE() - INTERVAL 6 DAY THEN '7 Days'
WHEN created_at >= CURDATE() - INTERVAL 29 DAY THEN'30 Days'
END)
但这将防止单个记录被多次计数。例如,第一张图片中的第2行和第3行需要在所有三个括号中计算1天、7天和30天,而第6行到第9行只需要在30天括号中计算
如何使用MySQL实现这一点?最简单的方法是将其作为列而不是行:
SELECT SUM(created_at = CURDATE()) as today
SUM(created_at >= CURDATE() - INTERVAL 6 DAY) as last_7_days,
SUM(created_at >= CURDATE() - INTERVAL 29 DAY) as last_30_days,
SUM(created_at < CURDATE() - INTERVAL 29 DAY) as older
FROM my_table;
如果您希望将响应分为几行,而不是一行几列,请以@Gordon Linoff作为起点。。。但是一次执行一行查询的效率不高,因为您访问表4次而不是1次!:
-- Row for the 1 day timeframe
SELECT '1 Day' AS `Timeframe`, SUM(created_at = CURDATE()) AS `Count`
FROM my_table
UNION
-- Row for the 7 days timeframe...
SELECT '7 Days' AS `Timeframe`, SUM(created_at >= CURDATE() - INTERVAL 6 DAY) AS `Count`
FROM my_table
UNION
SELECT '30 Days' AS `Timeframe`, SUM(created_at >= CURDATE() - INTERVAL 29 DAY) AS `Count`
FROM my_table
UNION
SELECT 'Older' AS `Timeframe`, SUM(created_at < CURDATE() - INTERVAL 29 DAY) AS `Count`
FROM my_table ;
在这两种情况下,您将从2017-07-25获得:
Timeframe | today
:-------- | ----:
1 Day | 0
7 Days | 4
30 Days | 8
Older | 0
dbfiddle一个UNION ALL语句就可以了。但Gordon的解决方案比较短。这是可行的,但无论如何要以行格式获得它?我使用它作为一个多方面的过滤器,我有一个ORM,它是用来处理每一个单独的组作为一行 Timeframe | today :-------- | ----: 1 Day | 0 7 Days | 4 30 Days | 8 Older | 0