0

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

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

  1. 如果任何遭遇已经开始,最后一次遭遇开始, - 或 -
  2. 如果没有开始相遇,则第一次预定的相遇

所以,我有点想要以下内容:

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. 只要我能准确地识别出那一次遭遇,我就不关心那个房间里的其他遭遇。
4

3 回答 3

2

尝试这样排序:

SELECT 
    TOP 1 * 
FROM 
    TABLE 
ORDER BY 
    CASE WHEN STARTED IS NULL THEN 0 ELSE 1 END, 
    STARTED DESC, 
    SCHEDULED ASC
于 2012-11-26T20:56:54.000 回答
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

于 2012-11-26T21:02:48.573 回答
0

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

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

  1. STARTED 列中具有非空值的行,以及
  2. STARTED 列中具有空值的行。

同样重要的是,在 SCHEDULED 字段中总是有一个有效值。

我想按组 #1 的 STARTED 值按降序排序,组 #2 按其 SCHEDULED 值按升序排序。

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

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

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

在我的测试中,如果所有行都有一个空的 STARTED 值,这会给我具有最新 STARTED 值的行,或者具有最早 SCHEDULED 值的行。

于 2012-12-04T13:42:08.777 回答