获取最后一次(如果发生1+)或首次安排(如果没有发生)

时间:2012-11-26 20:34:15

标签: sql sql-server sql-order-by

我在SQL Server中有一个代表医生/患者遭遇的表。其中一列是日期时间字段,表示遭遇开始的时间。还有另一个字段表示遭遇的计划时间。

我正在尝试编写一个查询来隔离满足以下条件的一次遭遇(对于某一天):

  1. 如果有任何遭遇已经开始,最后的遭遇开始, - 或 -
  2. 如果没有遇到任何遭遇,那么第一次预定会面
  3. 所以,我有点想要以下内容:

    SELECT 
        TOP 1 * 
    FROM 
        TABLE 
    ORDER BY 
        CASE WHEN STARTED IS NULL THEN 0 ELSE 1 END DESC, 
        IF STARTED IS NULL
            SCHEDULED ASC
        ELSE
            STARTED DESC
    

    我意识到我不能完全这样做,但我想知道我是否缺少其他方法来做到这一点。

    其他信息:

    1. 所有要比较的遭遇都会发生在同一个日历日。
    2. 这是一个较大的查询的一部分,我在其中发生/安排遭遇的房间进行分区。
    3. 只要我能准确识别出那次遭遇,我就不在乎那个房间里的其他遭遇。

3 个答案:

答案 0 :(得分:2)

尝试这样排序:

SELECT 
    TOP 1 * 
FROM 
    TABLE 
ORDER BY 
    CASE WHEN STARTED IS NULL THEN 0 ELSE 1 END, 
    STARTED DESC, 
    SCHEDULED ASC

答案 1 :(得分:0)

使用Johann的排序方法

Select Top 1
  *
From (
  Select
    0 As X,
    *
  From
    Encounter
  Where
    -- started after 00:00:00 today (maybe Started > GetDate() will suffice)
    Started >= DateAdd(day, DateDiff(day, 0, GetDate()), 0) And 
    -- started before 00:00:00 tomorrow
    Started < DateAdd(day, 1 + DateDiff(day, 0, GetDate()), 0)
  Union All
  Select
    1 As X,
    *
  From
    Encounter
  Where
    -- Sechduled after 00:00:00 today
    Scheduled >= DateAdd(day, DateDiff(day, 0, GetDate()), 0) And 
    -- started before 00:00:00 tomorrow
    Scheduled < DateAdd(day, 1 + DateDiff(day, 0, GetDate()), 0) 
  ) a
Order By
  X,
  Started Desc,
  Scheduled Asc

假设已启动始终与计划同一天,并且计划不可为空,这相当于:

Select Top 1
  *
From
  Encounter
Where
  -- Sechduled after 00:00:00 today
  Scheduled >= DateAdd(day, DateDiff(day, 0, GetDate()), 0) And 
  -- started before 00:00:00 tomorrow
  Scheduled < DateAdd(day, 1 + DateDiff(day, 0, GetDate()), 0) 
Order By
  Case When Started Is Null Then 0 Else 1 End,
  Started Desc,
  Scheduled;

http://sqlfiddle.com/#!3/9cc65/3

答案 2 :(得分:0)

我不确定在我的问题中是否特别清楚,但根据我的情景的具体标准,答案比我想象的容易得多。

基本上,它归结为我想将行分成两组:

  1. STARTED列中具有非空值的行,
  2. STARTED列中具有空值的行。
  3. 同样重要的是,在SCHEDULED字段中始终存在有效值。

    我希望按照他们的STARTED值按降序排序组#1,按照他们的SCHEDULED值按升序排序#2组。

    然后,我希望第1组中的第一个条目,或者 - 如果组#1为空 - 来自组#2的第一个条目。没有其他条目对此问题很重要。

    因为希望组#1按降序排序,所以我使用了以下解决方案:

    SELECT 
        TOP 1 * 
    FROM 
        TABLE 
    ORDER BY 
        STARTED DESC,
        SCHEDULED ASC
    

    在我的测试中,如果所有行的STARTED值都为空,则会为我提供具有最新STARTED值的行或具有最早SCHEDULED值的行。