[oracle] 分組計算連續兩列的日期差距

Hits: 398

分組計算連續兩列的日期差距

有時候在業務上需要分組計算連綠兩列的日期差距,這時候可以用到 oracle 的 analytic function (又稱 windows function),來進行計算。

實際案例

在 oracle 中可使用 leadlag 來找出上或下一列的值,假設現在我要找出病人執行 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')

file

這樣還有個問題,因為上述語法是跟前一列相比來計算日期的,但在第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')

file

參考連結

About the Author

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

You may also like these