【问题标题】:Conditional where statement in T-SQLT-SQL 中的条件 where 语句
【发布时间】:2011-05-28 14:44:35
【问题描述】:

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

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

所以如果值从 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.

谁能帮我解决这个问题?

样本数据

在上述情况下,记录 2 是我所追求的。

【问题讨论】:

  • 从数据样本中预期的样本数据和样本结果行将是一个很好的起点。对于阅读问题的人来说,这通常比广泛解释实际目标更清楚。一张图片胜过千言万语!
  • 所以,如果我理解正确的话,你需要最旧的记录才能出来,对吧?
  • 不,那是踢球者。它是创造的第一个历史记录。见编辑中的图片。在那种情况下,2 是原始值,然后更改为 1,然后再次更改为 2
  • 听起来您想要上面的第二条记录,但使用第一条记录的 SourceCreateDateTime。对吗?
  • 我不关心日期。我就在第二条记录中的 2 之后。日期用于对记录进行排序,并重新加入我的主选择查询。查看第一个 INNER JOIN,它需要带回第二个记录。

标签: sql tsql case where-clause where


【解决方案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 

【讨论】:

    【解决方案2】:

    使用CASE 代替您的伪代码:

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

    【讨论】:

    • +1 太简单了!我只是不明白我怎么没有想到这个!好东西! =)
    • 我遇到了一些错误。第一个是 Msg 8133, Level 16, State 1, Line 1 CASE 规范中的结果表达式都不能为 NULL。
    • 第二个是 Msg 156, Level 15, State 1, Line 24 关键字'NOT'附近的语法错误。
    猜你喜欢
    • 2011-05-28
    • 2022-01-14
    • 2013-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多