1

ステートメントLEFT JOINの各行の最初の結果を取得しようとしています。SELECT

現時点では、結合されたテーブルに 100 行ある場合、SELECT. 重複が発生しないように、最初に結合された行が必要です。

GROUP BYテーブルから複数の行を取得する必要があるため、使用できません。

私のクエリの基本的なバージョンは次のとおりです。

SELECT bg.PatientID, DATEDIFF(hour, bg.CreateDate, GETDATE()) TimeToTarget 
FROM BloodGlucose bg
    LEFT JOIN IVProtocol i ON i.PatientID = bg.PatientID
WHERE bg.BGValue >= i.TargetLow AND bg.BGValue <= i.TargetHigh
ORDER BY bg.PatientID ASC

使用してみDISTINCTましたが、データbg.CreateDateが常に同じであるとは限らないため、重複が返されます。

その左結合テーブルの最初の行が必要です。

アイデア/提案はありますか?

ありがとう!

4

2 に答える 2

4
;WITH x AS 
(
  SELECT 
    bg.PatientID, 
    TimeToTarget = DATEDIFF(hour, bg.CreateDate, GETDATE()),
    rn = ROW_NUMBER() OVER (PARTITION BY bg.PatientID ORDER BY bg.CreatedDate DESC) 
  FROM dbo.BloodGlucose AS bg
  LEFT JOIN dbo.IVProtocol AS i 
  ON i.PatientID = bg.PatientID
  WHERE bg.BGValue >= i.TargetLow 
  AND bg.BGValue <= i.TargetHigh
)
SELECT PatientID, TimeToTarget
FROM x
WHERE rn = 1
ORDER BY PatientID;

他の結果に結合するには:

;WITH x AS 
(
  ... same as above ...
)
SELECT x.PatientID, x.TimeToTarget, y.Something
 FROM x INNER JOIN dbo.SomethingElse AS y
 ON x.PatientID = y.PatientID
 WHERE x.rn = 1
 ORDER BY x.PatientID;
于 2012-08-13T17:20:37.100 に答える
2
SELECT bg.PatientID, DATEDIFF(hour, bg.CreateDate, GETDATE()) TimeToTarget 
FROM BloodGlucose bg
cross apply (
 select top 1 *
 from IVProtocol i
 where i.PatientID = bg.PatientID
 order by SOME_CRITERA
) i
WHERE bg.BGValue >= i.TargetLow AND bg.BGValue <= i.TargetHigh
ORDER BY bg.PatientID ASC

クロスアプライは、このような状況で便利なツールです。結合のように機能しますが、サブクエリ内で変数を使用できます。

于 2012-08-13T17:18:08.857 に答える