如何用MySQL的GROUP BY实现奇数列自定义输出及按日数据汇总
实现自定义分组输出的MySQL解决方案
结合你的示例数据和期望输出,我来帮你拆解如何用GROUP BY实现需求:
1. 先明确需求细节
从你的示例来看,Count(numbers)实际是当日所有numbers的总和(比如2018-04-20的10+15=25),而每个日期对应的info是该日期下最后一条记录的info(按id降序取第一条)。
2. 方案一:兼容MySQL 5.7及以下版本(子查询方式)
如果你的MySQL版本不支持窗口函数,可以用子查询来获取每个日期对应的目标info:
SELECT SUM(numbers) AS `Count(numbers)`, DATE(datetime) AS `date`, -- 子查询获取当前日期下id最大的那条记录的info (SELECT info FROM daily_dimension d2 WHERE DATE(d2.datetime) = DATE(d1.datetime) ORDER BY id DESC LIMIT 1) AS info FROM daily_dimension d1 GROUP BY DATE(datetime);
3. 方案二:MySQL 8.0+版本(窗口函数更简洁)
如果你的MySQL是8.0或以上,用窗口函数可以更高效清晰地实现:
WITH ranked_daily_data AS ( SELECT -- 按日期分组计算numbers总和 SUM(numbers) OVER (PARTITION BY DATE(datetime)) AS total_numbers, DATE(datetime) AS `date`, info, -- 给每个日期内的记录按id降序排名 ROW_NUMBER() OVER (PARTITION BY DATE(datetime) ORDER BY id DESC) AS row_rank FROM daily_dimension ) -- 只取每个日期排名第一的记录 SELECT total_numbers AS `Count(numbers)`, `date`, info FROM ranked_daily_data WHERE row_rank = 1;
4. 输出结果验证
执行上述SQL后,你会得到如下结果,和你的期望格式完全匹配:
| Count(numbers) | date | info |
|---|---|---|
| 25 | 2018-04-20 | Slow |
| 26 | 2018-04-21 | Avg |
| 30 | 2018-04-22 | Finish |
| 7 | 2018-04-23 | Fly |
灵活调整说明
如果你需要选择info的规则不是按id降序,而是其他条件(比如优先取某类info),只需要修改子查询或窗口函数的ORDER BY条件即可。
内容的提问来源于stack exchange,提问作者Bahirji Naik
相关产品推荐
相关产品推荐

