Попытка объединить один запрос для последующего использования в отчете SQL Server 2005. Мне нужно:
- Извлечь все отдельные записи для значений в столбце "Eventid" за определенный промежуток времени - похоже, это работает.
- Для каждого события, указанного выше, мне нужно найти все экземпляры одного и того же события, чтобы узнать, есть ли еще запись с именем TaskName, например, «review1%». Опять же, это похоже на работу.
- Вот где все усложняется: для каждой записи, где TaskName похожа на review1, мне нужно посмотреть, существует ли другая запись с таким же Eventid и где TaskName = 'End'. В конечном счете, мне нужно подсчитать, сколько записей имеют TaskName, например, «review1%», а затем сколько TaskName, например, «review1%» AND TaskName = «End». Я думаю, что это может быть достигнуто путем установки нового значения для каждой записи, и для Eventid, если запись существует с 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':
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
Итак, я попробовал следующее для TRY, чтобы выполнить # 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 есть первичный ключ, но, кажется, он ничего не помогает, когда я его включаю, и мне не разрешено менять таблицу. (тьфу) Я получил одно предложение использовать курсор и временную таблицу, но я не уверен, насколько плохо это может снизить производительность при запуске отчета. Заранее спасибо.