oracle 使用函数 ROW_NUMBER() OVER(PARTITION BY 列 ORDER BY 列 排序 ),自关联日志表,将列数据转换为 行数据
需求关联日志,呈现以下效果,使用 ROW_NUMBER() OVER(PARTITION BY ) 函数 排序分组函数
ID |
---|
1 |
2 |
3 |
4 |
5 |
效果
1 | 2 |
---|---|
2 | 3 |
3 | 4 |
4 | 5 |
日志表图 换床的日志记录
结果表图 ,期待结果 换床前床号,换床后床号
分析,可以通过关键词将患者分组后排序然后组成两个临时表,在临时表中添加 排序号 RNUM , SQL外层使用这个排序号 RNUM 添加关联规则本次序号 A的排序+1 关联到B表的下一行数据
sql 写法
SELECT T.PATIENT_ID,
T.VISIT_ID,
T.CHANGE_DATE_TIME,
T.BED_NO 换床前床号,
T.WARD_CODE,
T1.WARD_CODE,
T1.BED_NO 换床后床号
FROM (SELECT A.PATIENT_ID,
A.VISIT_ID,
A.CHANGE_DATE_TIME,
A.BED_NO,
A.WARD_CODE,
ROW_NUMBER() OVER(PARTITION BY A.PATIENT_ID, A.VISIT_ID ORDER BY A.CHANGE_DATE_TIME) RNUM
FROM BED_CHANGE_INFO A) T,
(SELECT B.PATIENT_ID,
B.VISIT_ID,
B.CHANGE_DATE_TIME,
B.BED_NO,
B.WARD_CODE,
ROW_NUMBER() OVER(PARTITION BY B.PATIENT_ID, B.VISIT_ID ORDER BY B.CHANGE_DATE_TIME) RNUM
FROM BED_CHANGE_INFO B) T1
WHERE T.PATIENT_ID = T1.PATIENT_ID(+)
AND T.VISIT_ID = T1.VISIT_ID(+)
AND T.RNUM + 1 = T1.RNUM(+)
ORDER BY T.PATIENT_ID, T.VISIT_ID, T.CHANGE_DATE_TIME;