Oracle SQL中基于两列分组获取最新记录的实现方法问询
问题与解决方案
原始数据
| SUBSCRIBER_NO | CUSTOMER_ID | SYS_CREATION_DATE | SYS_UPDATE_DATE | OPERATOR_ID |
|---|---|---|---|---|
| 61686209 | 199041640 | 19-JUN-22 | 19-JUN-22 | 611316378 |
| 61686209 | 145781645 | 24-AUG-20 | 19-JUN-22 | 611316378 |
| 61686210 | 199044567 | 19-JUN-22 | 19-JUN-22 | 611316379 |
| 61686210 | 145781234 | 24-AUG-20 | 17-JUN-22 | 611316379 |
筛选规则
- 针对同一
SUBSCRIBER_NO的记录:- 若
SYS_UPDATE_DATE值相同,选取SYS_CREATION_DATE最新的记录 - 若
SYS_UPDATE_DATE值不同,选取SYS_UPDATE_DATE最新的记录
- 若
Oracle SQL 查询语句
SELECT SUBSCRIBER_NO, CUSTOMER_ID, SYS_CREATION_DATE, SYS_UPDATE_DATE, OPERATOR_ID FROM ( SELECT t.*, ROW_NUMBER() OVER ( PARTITION BY SUBSCRIBER_NO ORDER BY SYS_UPDATE_DATE DESC, SYS_CREATION_DATE DESC ) AS rn FROM your_table_name t ) WHERE rn = 1;
说明:将
your_table_name替换为实际表名。窗口函数ROW_NUMBER()按SUBSCRIBER_NO分区,先按SYS_UPDATE_DATE降序排序(优先取最新更新日期),再按SYS_CREATION_DATE降序排序(同一更新日期下取最新创建日期),最后筛选出每个分区的第一条记录。
预期输出
| SUBSCRIBER_NO | CUSTOMER_ID | SYS_CREATION_DATE | SYS_UPDATE_DATE | OPERATOR_ID |
|---|---|---|---|---|
| 61686209 | 199041640 | 19-JUN-22 | 19-JUN-22 | 611316378 |
| 61686210 | 199044567 | 19-JUN-22 | 19-JUN-22 | 611316379 |
内容的提问来源于stack exchange,提问作者jerry
相关产品推荐
相关产品推荐

