0

医師と患者の出会いを表す SQL Server のテーブルがあります。列の 1 つは、出会いがいつ始まったかを表す日時フィールドです。出会いの SCHEDULED 時間を表す別のフィールドがあります。

次の基準を満たす (特定の日の) 1 つの出会いを分離するためのクエリを作成しようとしています。

  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. その 1 つの出会いを正確に特定できる限り、その部屋での残りの出会いは気にしません。
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

開始が常にスケジュールされた日と同じであり、スケジュールされたものがnull許容ではないという仮定では、これは次のようになります。

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

私の質問で特に明確だったかどうかはわかりませんが、私のシナリオの特定の基準に基づいて、答えは思ったよりもずっと簡単でした.

基本的に、行を 2 つのグループに分割したいという事実に要約されます。

  1. STARTED 列に null 以外の値を持つ行、および
  2. STARTED 列にヌル値がある行。

また、SCHEDULED フィールドには常に有効な値があるという事実も重要です。

グループ #1 を STARTED 値で降順で並べ替え、グループ #2 を SCHEDULED 値で昇順で並べ替えます。

次に、グループ #1 の最初のエントリが必要です。グループ #1 が空の場合は、グループ #2 の最初のエントリが必要です。この問題では、他のエントリは重要ではありません。

グループ #1 は降順でソートする必要があるため、次の解決策を使用しました。

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

私のテストでは、これにより、すべての行の STARTED 値が null の場合、最新の STARTED 値を持つ行、または最も古い SCHEDULED 値を持つ行が得られます。

于 2012-12-04T13:42:08.777 に答える