如何在SQL中按日期降序排序并连续分组COL_A/COL_B/COL_C数据
SQL排序需求:按组聚合并按最新日期优先排列
我需要用SQL对数据做如下排序:
- 优先按
start_date降序,确保最新的交易记录排在最前面 - 同时将
COL_A、COL_B、COL_C字段相同的记录归为一组,保持连续排列
试过ROW_NUMBER和DENSE_RANK函数,但没实现需求,求帮忙。
表数据
| COL_A | COL_B | COL_C | TASK | START_DATE | STATUS |
|---|---|---|---|---|---|
| REFERENCE | GOLD | ETL | Upload | 2022-08-04 16:40:17.000 | Completed |
| REFERENCE | GOLD | ETL | Translate | 2022-08-04 16:36:33.000 | Completed |
| REFERENCE | GOLD | ETL | Extract | 2022-08-04 16:21:41.000 | Completed |
| Hive | BRONZE | WORKFLOW | Translate | 2022-08-04 12:30:25.000 | Failed |
| Hive | DM | ETL | Extract | 2022-08-04 12:23:55.000 | Completed |
| Hive | BRONZE | WORKFLOW | Extract | 2022-08-04 12:15:44.000 | Completed |
| Standalone | CONS | ETL | Extract | 2022-08-04 07:17:31.000 | Failed |
| Moving Window | AGG | ETL | Upload | 2022-08-03 15:08:48.000 | Completed |
| Moving Window | AGG | ETL | Translate | 2022-08-03 15:05:41.000 | Completed |
| Moving Window | AGG | ETL | Extract | 2022-08-03 14:53:50.000 | Completed |
| Moving Window | ANLT | ETL | Upload | 2022-08-03 14:31:17.000 | Completed |
| Moving Window | ANLT | ETL | Translate | 2022-08-03 14:26:17.000 | Completed |
| Moving Window | ANLT | ETL | Extract | 2022-08-03 14:17:50.000 | Completed |
| Hive | BRONZE | BILL | Translate | 2022-08-03 13:46:19.000 | Completed |
| Standalone | CONS | ETL | Extract | 2022-08-03 13:34:09.000 | Failed |
预期输出
| COL_A | COL_B | COL_C | TASK | START_DATE | STATUS |
|---|---|---|---|---|---|
| REFERENCE | GOLD | ETL | Upload | 2022-08-04 16:40:17.000 | Completed |
| REFERENCE | GOLD | ETL | Translate | 2022-08-04 16:36:33.000 | Completed |
| REFERENCE | GOLD | ETL | Extract | 2022-08-04 16:21:41.000 | Completed |
| Hive | BRONZE | WORKFLOW | Translate | 2022-08-04 12:30:25.000 | Failed |
| Hive | BRONZE | WORKFLOW | Extract | 2022-08-04 12:15:44.000 | Completed |
| Hive | DM | ETL | Extract | 2022-08-04 12:23:55.000 | Completed |
| Standalone | CONS | ETL | Extract | 2022-08-04 07:17:31.000 | Failed |
| Moving Window | AGG | ETL | Upload | 2022-08-03 15:08:48.000 | Completed |
| Moving Window | AGG | ETL | Translate | 2022-08-03 15:05:41.000 | Completed |
| Moving Window | AGG | ETL | Extract | 2022-08-03 14:53:50.000 | Completed |
| Moving Window | ANLT | ETL | Upload | 2022-08-03 14:31:17.000 | Completed |
| Moving Window | ANLT | ETL | Translate | 2022-08-03 14:26:17.000 | Completed |
| Moving Window | ANLT | ETL | Extract | 2022-08-03 14:17:50.000 | Completed |
| Hive | BRONZE | BILL | Translate | 2022-08-03 13:46:19.000 | Completed |
| Standalone | CONS | ETL | Extract | 2022-08-03 13:34:09.000 | Failed |
解决方案
要实现需求,核心是先按每组的最新日期排序分组,组内再按单条记录的日期降序排列,以下两种方法均可实现:
方法一:子查询关联
SELECT t.* FROM your_table t JOIN ( SELECT COL_A, COL_B, COL_C, MAX(START_DATE) AS max_start_date FROM your_table GROUP BY COL_A, COL_B, COL_C ) g ON t.COL_A = g.COL_A AND t.COL_B = g.COL_B AND t.COL_C = g.COL_C ORDER BY g.max_start_date DESC, t.COL_A, t.COL_B, t.COL_C, t.START_DATE DESC;
方法二:窗口函数(更简洁)
SELECT * FROM your_table ORDER BY MAX(START_DATE) OVER (PARTITION BY COL_A, COL_B, COL_C) DESC, COL_A, COL_B, COL_C, START_DATE DESC;
逻辑说明
- 外层排序首条件为每组的最大
start_date降序,确保最新的组排在最前 - 接着按
COL_A、COL_B、COL_C排序,保证同组记录连续 - 最后按单条记录的
start_date降序,组内最新记录优先展示
内容的提问来源于stack exchange,提问作者LNC
相关产品推荐
相关产品推荐

