Hits: 398
分組計算連續兩列的日期差距
有時候在業務上需要分組計算連綠兩列的日期差距,這時候可以用到 oracle 的 analytic function
(又稱 windows function
),來進行計算。
實際案例
在 oracle 中可使用 lead
或 lag
來找出上或下一列的值,假設現在我要找出病人執行 A 醫令後再執行 B 醫令的日期差距,我可用 lag
這函數來實現。
SELECT T.CHART_NO, T.REG_DATE, D.NHI_CODE,
lag(TO_DATE(T.REG_DATE, 'YYYYMMDD')) OVER (ORDER BY T.CHART_NO, T.REG_DATE) - TO_DATE(T.REG_DATE, 'YYYYMMDD') AS date_diff
FROM OINMAST T
INNER JOIN OINORD D ON T.CHART_NO = D.CHART_NO AND T.CHART_SEQ = D.CHART_SEQ AND T.INS_MONTH = D.INS_MONTH AND T.REPAY_FLAG = D.REPAY_FLAG
WHERE T.CHART_NO IN (...) AND D.NHI_CODE IN ('92090C', '92091C')
這樣還有個問題,因為上述語法是跟前一列相比來計算日期的,但在第3列中因為換了一個病人,必須要分組計算,才能得到正確的日期差距,這時可在 OVER
語法中加入 PARTITION BY
來實現分組計算。
SELECT T.CHART_NO, T.REG_DATE, D.NHI_CODE,
lag(TO_DATE(T.REG_DATE, 'YYYYMMDD')) OVER (PARTITION BY T.CHART_NO ORDER BY T.CHART_NO, T.REG_DATE) - TO_DATE(T.REG_DATE, 'YYYYMMDD') AS date_diff
FROM OINMAST T
INNER JOIN OINORD D ON T.CHART_NO = D.CHART_NO AND T.CHART_SEQ = D.CHART_SEQ AND T.INS_MONTH = D.INS_MONTH AND T.REPAY_FLAG = D.REPAY_FLAG
WHERE T.CHART_NO IN (...) AND D.NHI_CODE IN ('92090C', '92091C')
Comments