2017-06-12 56 views
0

分組我有一個表SITE_SETTINGS類似如下:SQL:獲取最新的紀錄由多列在Oracle數據庫

SITE_ID SETTINGS_CODE UPDATE_TS OTHER_SETTINGS1 OTHER_SETTINGS2 
1   CODE1   21-JAN-17 S1    S2 
1   CODE1   23-JAN-17 S3    S4 
1   CODE2   14-JAN-17 S1    S4 
1   CODE2   18-JAN-17 S1    S3 
1   CODE2   21-JAN-17 S1    S2 
1   CODE3   04-FEB-17 S8    S9 
2   CODE1   21-MAR-17 S1    S2 
2   CODE2   21-JAN-17 S2    S5 
2   CODE1   21-MAR-17 S1    S5 
2   CODE2   10-MAR-17 S1    S5 
2   CODE3   10-JAN-17 S1    S5 

這些多個站點,每個站點有3種不同類型的SETTINGS_CODE。我需要所有網站的每個settings_code的最新記錄。這樣的事情:

SITE_ID SETTINGS_CODE UPDATE_TS OTHER_SETTINGS1 OTHER_SETTINGS2 
1   CODE1   23-JAN-17 S3    S4 
1   CODE2   21-JAN-17 S1    S2 
1   CODE3   04-FEB-17 S8    S9 
2   CODE1   21-MAR-17 S1    S2 
2   CODE2   10-MAR-17 S1    S5 
2   CODE3   10-JAN-17 S1    S5 

我想在自己的表上做一個連接,但它給了我重複的記錄。例如,對於SITE_ID = 1,我得到CODE1的多個相同記錄。這是我曾嘗試過的:

 select t.SITE_ID, t.SETTINGS_CODE, t.OTHER_SETTINGS1, t.OTHER_SETTINGS2, t.UPDATE_TS 
     from SITE_SETTINGS t 
     inner join (
      select SITE_ID, SETTINGS_CODE, max(UPDATE_TS) as MaxDate 
      from SITE_SETTINGS 
      group by SITE_ID, SETTINGS_CODE 
      order by SITE_ID, SETTINGS_CODE 
     ) tm on t.SITE_ID = tm.SITE_ID and t.SETTINGS_CODE=tm.SETTINGS_CODE and t.UPDATE_TS = tm.MaxDate 

我認爲我遇到的問題是無法按多列進行分組。有沒有辦法在沒有重複的情況下獲取數據?

回答

0

你可以做到這一點使用row_number()窗函數:

select * from (
    select SITE_SETTINGS.*, row_number() over(partition by SITE_ID, SETTINGS_CODE order by UPDATE_TS desc) as rn 
    from SITE_SETTINGS 
) t 
where rn = 1 
0
SELECT SITE_ID, 
     SETTINGS_CODE, 
     LATEST_UPDATE_TS, 
     OTHER_SETTINGS1, 
     OTHER_SETTINGS2 
    FROM 
    (
     SELECT SITE_ID, 
      SETTINGS_CODE, 
      UPDATE_TS, 
      MAX(UPDATE_TS) OVER (PARTITION BY SITE_ID,SETTINGS_CODE ORDER BY 
      UPDATE_TS) AS LATEST_UPDATE_TS, 
      OTHER_SETTINGS1, 
      OTHER_SETTINGS2 
     FROM SITE_SETTINGS 
    ) 
WHERE UPDATE_TS = LATEST_UPDATE_TS;