2017-06-16 43 views
1

我有兩個表MASTER_TABLEDOCUMENTS表。兩者都與列reference_id有關。 DOCUMENTS表中的列doc_iddoc_typedoc_creation_date 我們可以在DOCUMENTS表不同doc_creation_date多個條目每個doc_type。我的目標是獲取doc_typedoc_id在同一行上分別doc_type的最大doc_creation_date取多列值作爲列值

MASTER_TABLE 

REFERENCE_ID COLUMN1 COLUMN2 
    1   DATA1 DATA2 
    2   DATA3 DATA4 
    3   DATA5 DATA6 



DOCUMENTS 

REFERENCE_ID DOC_ID DOC_TYPE DOC_CREATION_DATE 
    1   11  PDF   16/06/2017 
    1   12  XLS   16/06/2017 
    1   13  TXT   16/06/2017 
    1   14  PDF   15/06/2017 
    1   15  XLS   15/06/2017 
    1   16  TXT   15/06/2017 
    2   17  PDF   16/06/2017 
    2   18  XLS   16/06/2017 
    2   19  TXT   16/06/2017 




EXPECTED OUTPUT 

REFERENCE_ID DOC_ID_PDF DOC_ID_XLS DOC_ID_TXT 
    1    11   12   13 
    2    17   18   19 

這可能使用單個查詢來實現。我嘗試了一種自我連接和支點,但是猜測是以錯誤的方式來做。我們有我們可以使用的Oracle 11g和12c數據庫。

+0

如果2個doc_ids具有相同的creation_date,該怎麼辦?例如doc_id 21和22的ref_id = 1和doc_type = pdf有creation_date = 2017年6月16日,哪一個應該被選中? – Debabrata

+0

一個參考ID將永遠不會有相同日期的2個文檔ID。他們至少有幾秒鐘的專欄,我沒有提出質疑爲簡單起見。在任何時間點,對於每個參考ID,每個文檔類型只會存在一個文檔ID。 –

+0

然後我發佈的答案將解決您的問題 – Debabrata

回答

1

Rank() Over([Partition by] Order by)其次Pivot將解決您的問題。 以下是代碼。如果多個doc_id具有相同的最大創建日期,以下將獲得最大doc_id。如果您需要以上方案的最小doc_id,請將max函數更改爲min,其條款爲pivot

WITH master_table AS 
    (SELECT 1 reference_id, 'DATA1' column1, 'DATA2' column2 
     FROM DUAL 
     UNION 
     SELECT 2 reference_id, 'DATA3' column1, 'DATA4' column2 
     FROM DUAL 
     UNION 
     SELECT 3 reference_id, 'DATA5' column1, 'DATA6' column2 
     FROM DUAL), 
    documents AS 
    (SELECT 1 reference_id, 11 doc_id, 'PDF' doc_type, 
      '16/06/2017' doc_creation_date 
     FROM DUAL 
     UNION 
     SELECT 1 reference_id, 12 doc_id, 'XLS' doc_type, 
      '16/06/2017' doc_creation_date 
     FROM DUAL 
     UNION 
     SELECT 1 reference_id, 13 doc_id, 'TXT' doc_type, 
      '16/06/2017' doc_creation_date 
     FROM DUAL 
     UNION 
     SELECT 1 reference_id, 14 doc_id, 'PDF' doc_type, 
      '15/06/2017' doc_creation_date 
     FROM DUAL 
     UNION 
     SELECT 1 reference_id, 15 doc_id, 'XLS' doc_type, 
      '15/06/2017' doc_creation_date 
     FROM DUAL 
     UNION 
     SELECT 1 reference_id, 16 doc_id, 'TXT' doc_type, 
      '15/06/2017' doc_creation_date 
     FROM DUAL 
     UNION 
     SELECT 2 reference_id, 17 doc_id, 'PDF' doc_type, 
      '16/06/2017' doc_creation_date 
     FROM DUAL 
     UNION 
     SELECT 2 reference_id, 18 doc_id, 'XLS' doc_type, 
      '16/06/2017' doc_creation_date 
     FROM DUAL 
     UNION 
     SELECT 2 reference_id, 19 doc_id, 'TXT' doc_type, 
      '16/06/2017' doc_creation_date 
     FROM DUAL) 
SELECT * 
    FROM (SELECT reference_id, doc_id, doc_type 
      FROM (SELECT x.reference_id, y.doc_id, y.doc_type, 
         y.doc_creation_date, 
         RANK() OVER (PARTITION BY x.reference_id, y.doc_type ORDER BY y.doc_creation_date DESC) 
                     RANK 
        FROM master_table x JOIN documents y 
         ON (x.reference_id = y.reference_id) 
         ) 
     WHERE RANK = 1) 
    pivot (max(doc_id) 
    FOR doc_type 
    IN ('PDF' doc_id_pdf, 'XLS' doc_id_xls,'TXT' doc_id_txt));