2017-09-12 43 views
0

假設我有一張測試結果表和一張治療日期表。如果患者在測試時接受治療,我想組裝一個數據集,其中包含測試結果和等於1的指標。如何獲取GROUP BY查詢中的任意值

testresult表具有PatientID,Date和Value列。 treatmentDate表具有PatientID,以及每次治療的開始日期和結束日期。 PatientID可能已經多次開始和停止治療,並且可以進行任何數量的測試,包括治療和治療。

這是我想出了查詢:

select a.PatientID 
,a.[Date] 
,a.[Value] 
,SUM(CASE WHEN a.[Date]>b.[Start] and a.[Date]<=b.[End] THEN 1 ELSE 0 END) as IsOnTreatment 
from testresults a 
left join 
treatmentDates b on a.PatientID=b.PatientID 
group by a.PatientID,a.[Date],a.[Value] 

在這種情況下,SUM作品因爲治療從來沒有重疊。但在其他情況下,我可能想要做這種事情,這可能不是事實。 ANY在SQL Server中有不同的用途,但有沒有不同的窗口函數告訴我是否有任何行有匹配,而不是所有匹配的SUM

我能想到的唯一的事情就是包裹在另一個CASE語句行:

select a.PatientID 
,a.[Date] 
,a.[Value] 
,CASE WHEN SUM(CASE WHEN a.[Date]>b.[Start] and a.[Date]<=b.[End] THEN 1 ELSE 0 END) >0 THEN 1 ELSE 0 END as IsOnTreatment 
from testresults a 
left join 
treatmentDates b on a.PatientID=b.PatientID 
group by a.PatientID,a.[Date],a.[Value] 
+0

如何將SUM()更改爲MAX()? – EricZ

+0

而不是你可以使用你的case語句在哪裏條件如--- >> where 1 =(CASE WHEN a。[Date]> b。[Start] and a。[Date] <= b。[End] THEN 1 ELSE 0 END) –

回答

0

既然你不採取從治療的任何數據,一個簡單的exists應該足夠了:

select a.PatientID, a.[Date], a.[Value], 
    case when exists (
    select 0 from treatmentDates b 
    where a.PatientID=b.PatientID and a.[Date]>b.[Start] and a.[Date]<=b.[End] 
) then 1 else 0 end as [IsOnTreatment] 
from testresults a; 

如果您需要處理表中的某些列,可以將子查詢移動到outer apply並將top (1)添加到它。