1

entityID フィールドから重複したエントリを返すことなく、特定のエンティティ レコードのリストを返すクエリを作成しようとしています。DISTINCTentityID を超える結果セットを認識せず、DISTINCTすべてのORDER BYフィールドを返す必要があるレポート エンジンにリストが渡されているため、クエリを使用できません。

レポート エンジンも同じ実行で同じエンティティのレポートを 2 回処理できないため、結果セットに重複するエンティティ ID を含めることはできません。一時テーブルもサポートされていないという難しい方法を見つけました。

レポート エンジンでは entity_header レベルでの並べ替えしか許可されておらず、report.status に基づいて並べ替える必要があるため、クエリでエントリを並べ替える必要があります。ありがたいことに、レポート エンジンは結果を返す順序を尊重します。

表は次のとおりです。

entity_header
=================================================
entityID(pk)    Location        active      name
1               LOCATION1       0           name1
2               LOCATION1       0           name2
3               LOCATION2       0           name3
4               LOCATION3       0           name4
5               LOCATION2       1           name5
6               LOCATION2       0           name6

report
========================================================
startdate       entityID(fk)    status      reportID(pk)
03-10-2013      1               running     1
03-12-2013      2               running     2
03-10-2013      1               stopped     3
03-10-2013      3               stopped     4
03-12-2013      4               running     5
03-10-2013      5               stopped     6
03-12-2013      6               running     7

これまでに取得したクエリは次のとおりです。これは、ほとんど必要なものです。

SELECT entity_header.entityID
FROM entity_header eh
INNER JOIN report r on r.entityID = eh.entityID
WHERE r.startdate between getdate()-7.5  and getdate()
AND eh.active = 0
AND eh.location in ('LOCATION1','LOCATION2')
AND r.status is not null
AND eh.name is not null 
GROUP BY eh.entityID, r.status, eh.name
ORDER BY r.status, eh.name;

このコミュニティが提供できるアドバイスをいただければ幸いです。必要な追加情報を提供できるよう最善を尽くします。

4

1 に答える 1

0

これは、ms SQL のみで実行される実用的なサンプルです。

rank() を使用して、entityID が結果に表示される回数をカウントしています。リストとして保存されます。

リストには、entityID の発生回数の整数値が含まれます。

where a.list = 1を使用して、結果をフィルタリングします。ORDER BY a.ut, a.enを使用すると、結果がソートされます。ut と en はソートに使用されます。

SELECT a.entityID FROM (
SELECT distinct TOP (100) PERCENT eh.entityID, 
     rank() over(PARTITION BY eh.entityID ORDER BY r.status, eh.name) as list,
     r.status ut, eh.name en
FROM report AS r INNER JOIN entity_header as eh ON r.entityID = eh.entityID
WHERE (r.startdate BETWEEN GETDATE() - 7.5 AND GETDATE()) AND (eh.active = 0) 
 AND (eh.location IN ('LOCATION1', 'LOCATION2'))
ORDER BY r.status, eh.name
) AS a
where a.list = 1
ORDER BY a.ut, a.en
于 2013-03-12T20:51:05.433 に答える