2017-06-16 8 views
1

私は2つのテーブルMASTER_TABLEDOCUMENTSテーブルを持っています。両方とも列に関連していますreference_idDOCUMENTSの表は、我々は異なるdoc_creation_dateと各doc_typeためDOCUMENTSテーブル内の複数のエントリを持つことができ、列doc_iddoc_typedoc_creation_date を持っています。私の目的はdoc_typeとmax 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 

のための単一の行の各doc_typeためdoc_idは、単一のクエリを使用して達成するために、このことは可能ですフェッチすることです。私は自己結合とピボットを試みたが、間違ったやり方をしていると推測する。 Oracle 11gおよび12cデータベースを使用しています。

+0

2つのdoc_idsのcreation_dateが同じ場合はどうなりますか?例えばdoc_id ref_id = 1とdoc_type = pdfの21&22にcreation_date = 16-Jun-2017がありますが、これは選択する必要がありますか? – Debabrata

+0

1つのref idは、同じ日付のために2つのdoc idを持つことはありません。彼らは私が単純化の目的のために問題にしてくれなかった秒のコラムで少なくとも異なっています。どの時点でも、各ref idには各docタイプごとに1つのdoc idしか存在しません。 –

+0

それから、私が投稿した答えはあなたの問題を解決するでしょう – Debabrata

答えて

1

Rank() Over([Partition by] Order by)に続いてPivotが問題を解決します。 コードは次のとおりです。複数のdoc_idsの最大作成日が同じである場合は、次のようにmax doc_idを取得します。上記のシナリオで最小のdoc_idが必要な場合は、max関数を節のminに変更してください。

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)); 
関連する問題