Oracle查询:按ID获取首次出现的日期记录
Oracle SQL:获取每个ID的首次出现记录
示例表数据
| Name | ID | DATE |
|---|---|---|
| Shane | 1 | 01JAN2023 |
| Angie | 2 | 02JAN2023 |
| Shane | 1 | 02JAN2023 |
| Austin | 3 | 03JAN2023 |
| Shane | 1 | 03JAN2023 |
| Angie | 2 | 03JAN2023 |
| Tony | 4 | 05JAN2023 |
预期输出
| Name | ID | DATE |
|---|---|---|
| Shane | 1 | 01JAN2023 |
| Angie | 2 | 02JAN2023 |
| Austin | 3 | 03JAN2023 |
| Tony | 4 | 05JAN2023 |
解决方案
以下是几种在Oracle中实现需求的SQL写法:
方法1:分组聚合+关联查询
通过分组ID找到每个ID的最早日期,再关联原表获取对应Name(适用于同一ID对应唯一Name的场景):
SELECT t.Name, t.ID, t.DATE FROM your_table t INNER JOIN ( SELECT ID, MIN(DATE) AS min_date FROM your_table GROUP BY ID ) t_min ON t.ID = t_min.ID AND t.DATE = t_min.min_date;
方法2:窗口函数ROW_NUMBER()
利用窗口函数对每个ID的记录按日期排序,筛选出排名第一的条目:
SELECT Name, ID, DATE FROM ( SELECT Name, ID, DATE, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY DATE ASC) AS rn FROM your_table ) WHERE rn = 1;
若同一ID在最早日期存在多条记录,且需要保留所有这类记录,可将ROW_NUMBER()替换为RANK()或DENSE_RANK()。
方法3:Oracle特有的KEEP子句
通过KEEP子句直接在聚合查询中获取最早日期对应的Name:
SELECT ID, MIN(Name) KEEP (DENSE_RANK FIRST ORDER BY DATE ASC) AS Name, MIN(DATE) AS DATE FROM your_table GROUP BY ID;
内容的提问来源于stack exchange,提问作者CreationSL
相关产品推荐
相关产品推荐

