2017-06-16 11 views
1

Ich habe zwei Tabellen MASTER_TABLE und DOCUMENTS Tabelle. Beide sind mit einer Spalte reference_id verwandt. DOCUMENTS Tabelle hat Spalten doc_id, doc_type und doc_creation_date Wir können für jeden doc_typein DOCUMENTS Tabelle mehr als einen Eintrag haben mit verschiedenen doc_creation_date. Mein Ziel ist die doc_type und doc_id für jeden doc_type in einer einzigen Zeile für den max doc_creation_dateHolen Sie mehrere Zeilenwerte als Spaltenwerte

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 

Sind das möglich zu holen mit einer einzigen Abfrage zu erreichen. Ich habe versucht, mich selbst zu verbinden und zu drehen, aber rate mal, ich mache es falsch. Wir haben Oracle 11g und 12c Datenbanken, die wir verwenden können.

+0

Was passiert, wenn 2 doc_ids dasselbe creation_date haben? z.B. doc_id 21 & 22 von ref_id = 1 und doc_type = pdf haben creation_date = 16-Jun-2017, welche sollte man abholen? – Debabrata

+0

Eine Referenz-ID hat nie zwei IDs für dasselbe Datum. Sie unterscheiden sich mindestens in Sekunden Spalte, die ich aus Gründen der Einfachheit nicht zur Verfügung gestellt habe. Zu jedem Zeitpunkt existiert nur eine Dokument-ID für jeden Dokumenttyp für jede Referenz-ID. –

+0

Dann wird die Antwort, die ich gepostet habe, dein Problem lösen – Debabrata

Antwort

1

Rank() Over([Partition by] Order by) gefolgt von Pivot wird Ihr Problem lösen. Folgendes ist der Code. Im Folgenden erhalten Sie die maximale doc_id für den Fall, dass mehrere doc_ids dasselbe maximale Erstellungsdatum haben. Wenn Sie die minimale doc_id für das obige Szenario benötigen, ändern Sie die max-Funktion in min in pivot Klausel.

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)); 
Verwandte Themen