SQL查询需求:按日期取最后一行,求和type为DC的number字段
问题解决:按日期分组取最后一行并求和
原始数据表
| id | date | number | type |
|---|---|---|---|
| 1 | 2022-02-02 | 1 | DC |
| 2 | 2022-02-03 | 20 | DC |
| 3 | 2022-02-03 | 9 | DC |
| 4 | 2022-03-04 | 2 | KF |
需求说明
筛选type等于'DC'的数据,按date分组取每组的最后一行(以id最大作为“最后一行”的判断依据),对这些行的number列求和,预期结果为10。
解决方案
方法1:使用窗口函数(适用于MySQL 8.0+、PostgreSQL、SQL Server等)
利用ROW_NUMBER()窗口函数对每个日期分组内的数据按id降序排序,标记出每组的第一行(即最后插入的行),再求和:
SELECT SUM(number) AS total_sum FROM ( SELECT number, ROW_NUMBER() OVER (PARTITION BY date ORDER BY id DESC) AS rn FROM your_table_name WHERE type = 'DC' ) t WHERE rn = 1;
方法2:子查询关联(兼容MySQL 5.x等不支持窗口函数的数据库)
先通过子查询找出每个日期下的最大id,再关联原表获取对应的number值并求和:
SELECT SUM(t1.number) AS total_sum FROM your_table_name t1 JOIN ( SELECT date, MAX(id) AS max_id FROM your_table_name WHERE type = 'DC' GROUP BY date ) t2 ON t1.date = t2.date AND t1.id = t2.max_id WHERE t1.type = 'DC';
两种方法执行后都会返回结果10,符合预期。
内容的提问来源于stack exchange,提问作者pluto project
相关产品推荐
相关产品推荐

