如何在GROUP BY查询中获取ANY

时间:2017-09-12 15:27:46

标签: sql sql-server

假设我有一张测试结果表和一份治疗日期表。我想用测试结果组装一个数据集,如果患者在测试时接受治疗,则指示等于1。

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?< / p>

我唯一能想到的就是将该行包装在另一个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]

1 个答案:

答案 0 :(得分: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)