oracleは2つのフィールドでover(partition by A,B order by C)をパーティション化する


需要の整理
筆者の業務理解能力は一般的で、需要は私の理解によってデータベースロジックに転化した後に大体このようにする:TBを検索するLOGで違うSYSTEM_ID対応の毎日の最新データ、同時にTB_に接続LOG, TB_INFO, TB_TYPEの3つのテーブルは、他の必要なフィールド値を検出します.
ソリューション
このニーズを解決する核心は、TBを検索することです.LOGで違うSYSTEM_IDに対応する毎日の最新データは、外部キーに基づいてテーブルに接続して検索すると簡単になります.筆者のある同僚の想定では、ここでover(PARTITION BY TB_LOG.SYSTEM_ID,TB_LOG.EXECUTE_DAY)という2つのフィールドの方法を採用している.これはGROUP BY TB_LOG.SYSTEM_ID,TB_LOG.EXECUTE_DAYの効果、さらにORDER BY TB_LOG.CREATE_DATE DESCは作成時間に従って並べ替え、ROW_を取るNUM=1最初のデータでよい.事実はこれが頼りになることを証明して、最終的なSQLは以下の通りです.
SELECT T4.*, T3.*
  from (SELECT T1.*, T2.*
          FROM (SELECT *
                  FROM (SELECT TSL.*,
                               row_number() over(partition by TSL.SYSTEM_ID, TSL.EXECUTE_DAY ORDER BY TSL.CREATE_DATE DESC) AS ROW_NUM
                          FROM TB_LOG TSL
                        -- WHERE         ...
                        )
                 WHERE ROW_NUM = 1) T1,
               TB_INFO T2
         WHERE T1.SYS_SEQ_NO = T2.SEQ_NO) T3,
       TB_TYPE T4
 where T4.SEQ_NO = T3.MONITOR_TYPE_ID
--          ...