最終的に SQL Server 2005 レポートで使用するために、1 つのクエリをまとめようとしています。する必要がある:
- 時間枠の「eventid」列の値のすべての個別のレコードを取得します-これは機能しているようです。
- 上記のイベント ID ごとに、同じイベント ID のすべてのインスタンスを検索して、「review1%」などの TaskName を持つ別のレコードがあるかどうかを確認する必要があります。繰り返しますが、これはうまくいくようです。
- ここからが複雑になります。TaskName が review1 のようなレコードごとに、同じ eventid を持ち、TaskName='End' である別のレコードが存在するかどうかを確認する必要があります。最終的に、'review1%' のような TaskName を持つレコードの数と、'review1%' AND TaskName='End' のような TaskName を持つレコードの数が必要です。これは、各レコードに新しい値を設定し、イベント ID に、TaskName='End' のレコードが存在する場合は 1 に設定し、そうでない場合は 0 に設定することで実現できると思います。
以下のクエリは、上記の項目 #1 を達成しているようです。
SELECT eventid, TimeStamp, TaskName, filepath
FROM (SELECT eventid, TimeStamp, filepath, TaskName,
ROW_NUMBER() OVER(PARTITION BY eventid
ORDER BY TimeStamp DESC)
AS seq
FROM eventrecords where ((TimeStamp >= '2010-4-1 00:00:00.000')
and (TimeStamp <= '2010-4-21 00:00:00.000'))) AS T
WHERE seq = 1 order by eventid
そして、以下のクエリは#2を達成しているようです:
SELECT eventid, TimeStamp, TaskName, filepath
FROM (SELECT eventid, TimeStamp, filepath, TaskName,
ROW_NUMBER() OVER(PARTITION BY eventid
ORDER BY TimeStamp DESC)
AS seq
FROM eventrecords where ((TimeStamp >= '2010-4-1 00:00:00.000')
and (TimeStamp <= '2010-4-21 00:00:00.000')) and TaskName like 'Review1%') AS T
WHERE seq = 1 order by eventid
これにより、TaskName='End' を持つイベント ID が返されます。
SELECT eventid, TimeStamp, TaskName, filepath
FROM (SELECT eventid, TimeStamp, filepath, TaskName,
ROW_NUMBER() OVER(PARTITION BY eventid
ORDER BY TimeStamp DESC)
AS seq
FROM eventrecords where ((TimeStamp >= '2010-4-1 00:00:00.000')
and (TimeStamp <= '2010-4-21 00:00:00.000')) and TaskName like 'Review1%') AS T
WHERE seq = 1
and eventid in
(Select eventid from
eventrecords
where TaskName = 'End')
order by eventid
だから私は#3を達成するために次のことを試みました:
SELECT eventid, TimeStamp, TaskName, filepath
FROM (SELECT eventid, TimeStamp, filepath, TaskName,
ROW_NUMBER() OVER(PARTITION BY eventid
ORDER BY TimeStamp DESC)
AS seq
FROM eventrecords where ((TimeStamp >= '2010-4-1 00:00:00.000')
and (TimeStamp <= '2010-4-21 00:00:00.000')) and TaskName like 'Review1%') AS T
WHERE seq = 1
and
case
when (eventid in
(Select eventid from
eventrecords
where TaskName = 'End') then 1
else 0) as bit
end
order by eventid
これを実行しようとすると、「キーワード 'then' 付近の構文が正しくありません」というメッセージが表示されます。私が間違っているのかわかりません。このような例はどこにも見たことがありません。
eventrecords には主キーがあることに言及する必要がありますが、それを含めても何の役にも立たないようで、テーブルを変更することは許可されていません。(うーん) カーソルと一時テーブルを使用するという提案を 1 つ受け取りましたが、レポートの実行時にパフォーマンスがどれほど低下するかはわかりません。前もって感謝します。