2017-08-03 11 views
0

私はこのテーブル構造に基づいてレポートを作成する必要があります。それは示していくつかの値についてはSQLサーバーの外部結合?

SELECT doc.object_name as doc_name, 
     pack.object_name as pack_name, 
     pack.r_creation_date as pack_date 
FROM vale_eng_document_sp doc 
left outer join dm_relation_s rel on doc.r_object_id = rel.parent_id 
left outer join vale_eng_package_sp pack on rel.child_id = pack.r_object_id 
WHERE 
    doc.r_object_type='vale_eng_document' 
and doc.i_is_deleted = 0 
and (pack.i_is_deleted IS NULL or pack.i_is_deleted = 0) 
and (rel.relation_name IS NULL or rel.relation_name='AO Project Package') 

:私は、以下のクエリを使用してSQL Serverのビューを作成した要件を満たすために

Table structure image

DOCUMENT1  PACKAGE1 01/01/2016 00:00:00 
DOCUMENT1  PACKAGE2 01/01/2017 00:00:00 
DOCUMENT2  NULL  NULL 

これは同じドキュメントの2倍です。 tは2つ以上のパッケージに関連しています。 この状況が発生した場合、エンドユーザーはr_creation_date属性に基づいて最新のパッケージのみを表示します。

そこで、彼らはこの結果を表示する:

DOCUMENT1  PACKAGE2 01/01/2017 00:00:00 
DOCUMENT2  NULL  NULL 

私はこの要件を満たすために私の見解では作成するどのような変更が必要ですか?

答えて

0

ROW_NUMBERを使用すると、最新のレコードを分割して検索し、最新のレコードのみを含むように派生テーブルからフィルタすることができます。

SELECT doc_name, pack_name, pack_date 
FROM (
    SELECT doc.object_name as doc_name, pack.object_name as pack_name, pack.r_creation_date as pack_date, 
     ROW_NUMBER() OVER (PARTITION BY doc.r_object_id ORDER BY pack.r_creation_date DESC) AS RowNum 
    FROM vale_eng_document_sp doc 
     left outer join dm_relation_s rel on doc.r_object_id = rel.parent_id 
     left outer join vale_eng_package_sp pack on rel.child_id = pack.r_object_id 
    WHERE doc.r_object_type='vale_eng_document' 
     and doc.i_is_deleted = 0 
     and (pack.i_is_deleted IS NULL or pack.i_is_deleted = 0) 
     and (rel.relation_name IS NULL or rel.relation_name='AO Project Package') 
    ) T 
WHERE T.RowNum = 1 -- Only most recent record as requested 
+0

私は、docは、複数のパッケージに –

+0

合意、修正答えを持つことができるので、パーティションは 'JOIN'のdoc.r_object_id'左側BY'だと思います。ありがとう! –