oracle 使用函数 ROW_NUMBER() OVER(PARTITION BY 列 ORDER BY 列 排序 ),自关联日志表,将列数据转换为 行数据

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

日志表图 换床的日志记录
oracle 使用函数 ROW_NUMBER() OVER(PARTITION BY 列  ORDER BY 列 排序 ),自关联日志表,将列数据转换为 行数据

结果表图 ,期待结果 换床前床号,换床后床号
oracle 使用函数 ROW_NUMBER() OVER(PARTITION BY 列  ORDER BY 列 排序 ),自关联日志表,将列数据转换为 行数据

分析,可以通过关键词将患者分组后排序然后组成两个临时表,在临时表中添加 排序号 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;