如何拆分日期列并按ID区分最大/最小日期(单日期时Min为Null)
解决方案:根据ID的日期记录数动态调整Min列值
你可以在原有窗口函数查询的基础上,增加统计每个ID日期记录数的窗口函数,再结合CASE条件判断来实现需求:
SELECT id, name, MAX(date) OVER (PARTITION BY id) AS max_date, CASE WHEN COUNT(*) OVER (PARTITION BY id) = 1 THEN NULL ELSE MIN(date) OVER (PARTITION BY id) END AS min_date FROM your_table;
逻辑说明
COUNT(*) OVER (PARTITION BY id):统计每个ID分组下的记录总条数- 当记录条数为1时,
min_date返回NULL;否则返回该ID对应的最小日期 max_date始终保留该ID的最大日期,不受记录数影响
示例验证
假设原表数据如下:
| id | name | date |
|---|---|---|
| 1 | 张三 | 2023-01-01 |
| 2 | 李四 | 2023-02-01 |
| 2 | 李四 | 2023-03-01 |
| 3 | 王五 | 2023-04-01 |
执行上述SQL后,输出结果为:
| id | name | max_date | min_date |
|---|---|---|---|
| 1 | 张三 | 2023-01-01 | NULL |
| 2 | 李四 | 2023-03-01 | 2023-02-01 |
| 2 | 李四 | 2023-03-01 | 2023-02-01 |
| 3 | 王五 | 2023-04-01 | NULL |
完全符合单日期ID的Min列为Null、多日期ID正常显示最大最小日期的需求。
内容的提问来源于stack exchange,提问作者Sid
相关产品推荐
相关产品推荐

