T-SQL中的条件where语句

时间:2010-12-21 03:16:32

标签: sql tsql case where-clause where

我有一个表,它返回一个值的历史记录,以及当前的值,每个都有一个日期。

最早的日期是主要记录。如果更改了值,则使用旧值创建新记录,并使用新值更新主记录。如果再次发生这种情况,则会创建第三条记录,其中包含现在的旧值。

因此,如果值从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 个答案:

答案 0 :(得分:1)

试试这个:

    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 

答案 1 :(得分:-1)

使用CASE代替您的伪代码:

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