Условный оператор where в T-SQL - PullRequest
       36

Условный оператор where в T-SQL

4 голосов
/ 21 декабря 2010

У меня есть таблица, которая возвращает историю значения, а также текущее, каждое с датой.

Самая старая дата - основная запись.Если значение изменяется, создается новая запись со старым значением, а основная запись обновляется новым значением.Если это происходит снова, создается третья запись, которая содержит старое значение.

Так что, если значение начинается с 4, изменяется на 2, а затем снова на 1. Записи будут идти

1
4
2

В настоящее время я создаю внутреннее соединение таблицы с самим собой следующим образом, которая получает максимальную дату из 3 приведенных выше записей, которая будет равна 2. Фактическое значение, которое мне нужно, это 4. Самый простой способсказать, является ли запись исторической, означает, что TriageEndDateTime имеет значение NULL.

INNER JOIN (SELECT EmergencyAttendanceId,MIN(SourceCreateDateTime) as Max_Date
                FROM FactEmergencyAttendanceTriageDetail 
                GROUP BY EmergencyAttendanceId) AS EAiD 
                ON EAiD.EmergencyAttendanceId = FactEmergencyAttendanceTriageDetail.EmergencyAttendanceId
                AND EAiD.Max_Date = FactEmergencyAttendanceTriageDetail.SourceCreateDateTime

Что мне нужно сделать, это выбрать вторую запись, но только если она существует.Так что-то вроде этого.

 SELECT EmergencyAttendanceId,MIN(SourceCreateDateTime) as Max_Date
    FROM FactEmergencyAttendanceTriageDetail 
    WHERE IF COUNT(EmergencyAttendanceId) > 1 THEN TriageEndDateTime Is NULL ELSE NOT NULL
    GROUP BY EmergencyAttendanceId 
    inside the INNER JOIN.

Может ли кто-нибудь помочь мне с этим?

Пример данных

alt text

В приведенном выше случае запись 2 - это та, которую яЯ после.

Ответы [ 2 ]

1 голос
/ 21 декабря 2010

Попробуйте это:

    SELECT EmergencyAttendanceId


    case when count(EmergencyAttendanceId) > 1 then
          MIN
          (
          case when TriageDateTime is null then SourceCreateDateTime end 
          ) 
    else
          min(SourceCreateDateTime)
    end as max_date


    FROM FactEmergencyAttendanceTriageDetail 
    GROUP BY EmergencyAttendanceId 
0 голосов
/ 21 декабря 2010

Используйте CASE вместо вашего псевдокода:

WHERE TriageEndDateTime = 
    CASE WHEN EmergencyAttendanceId > 1 THEN NULL ELSE NOT NULL END
...