我在SQL Server中有一个代表医生/患者遭遇的表。其中一列是日期时间字段,表示遭遇开始的时间。还有另一个字段表示遭遇的计划时间。
我正在尝试编写一个查询来隔离满足以下条件的一次遭遇(对于某一天):
所以,我有点想要以下内容:
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
我意识到我不能完全这样做,但我想知道我是否缺少其他方法来做到这一点。
其他信息:
答案 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;
答案 2 :(得分:0)
我不确定在我的问题中是否特别清楚,但根据我的情景的具体标准,答案比我想象的容易得多。
基本上,它归结为我想将行分成两组:
同样重要的是,在SCHEDULED字段中始终存在有效值。
我希望按照他们的STARTED值按降序排序组#1,按照他们的SCHEDULED值按升序排序#2组。
然后,我希望第1组中的第一个条目,或者 - 如果组#1为空 - 来自组#2的第一个条目。没有其他条目对此问题很重要。
因为希望组#1按降序排序,所以我使用了以下解决方案:
SELECT
TOP 1 *
FROM
TABLE
ORDER BY
STARTED DESC,
SCHEDULED ASC
在我的测试中,如果所有行的STARTED值都为空,则会为我提供具有最新STARTED值的行或具有最早SCHEDULED值的行。