Oracle中实现同ID多行指定字段拆分转独立列的方法
Oracle 同ID多日期行转列查询方案
核心实现逻辑:先对同一ID下的日期按时间先后排序编号,再通过条件聚合将不同序号的日期映射到对应列,无值的列自动留空。
假设存储原始数据的表名为record_tbl,字段为ID(字符型)、RECORD_DATE(日期型,注意Date是Oracle保留关键字,不建议直接作为字段名),可直接使用以下SQL:
WITH sorted_rn AS ( SELECT ID, RECORD_DATE, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY RECORD_DATE) AS rn FROM record_tbl ) SELECT ID, MAX(CASE WHEN rn = 1 THEN RECORD_DATE END) AS Date1, MAX(CASE WHEN rn = 2 THEN RECORD_DATE END) AS Date2, MAX(CASE WHEN rn = 3 THEN RECORD_DATE END) AS Date3 FROM sorted_rn GROUP BY ID ORDER BY ID;
使用说明
- 如果你的表字段名必须用
Date,所有引用该字段的位置需要加双引号转义,写为"Date",避免语法报错。 - 如果需要将日期以
6/15/2022 13:27的字符串格式输出,可以对日期列做格式化处理,例如将Date1的计算逻辑替换为TO_CHAR(MAX(CASE WHEN rn = 1 THEN RECORD_DATE END), 'MM/DD/YYYY HH24:MI') AS Date1,Date2、Date3同理。 - 该写法自动适配同ID下1~N条记录的场景,序号超过3的日期不会出现在结果中,不足3个日期的列自动返回空值,完全匹配需求。
- 你提供的原始数据中ID为
20220614175302951090的记录仅存在1条日期,上述SQL会正常返回该条记录,对应Date1为6/15/2022 13:38,Date2、Date3为空,你给出的期望结果中遗漏了该ID。
内容的提问来源于stack exchange,提问作者NavidSH
相关产品推荐
相关产品推荐

