sql - How to get ANY in GROUP BY query -
suppose have table of test results , table of treatment dates. want assemble dataset test results , indicator equal 1 if patient on treatment @ time of test.
the testresult table has patientid, date, , value columns. treatmentdate table has patientid, along start date , end date of each treatment. patientid may have have started , stopped treatment many times, , have number of tests both on , off treatment.
here's query came with:
select a.patientid ,a.[date] ,a.[value] ,sum(case when a.[date]>b.[start] , a.[date]<=b.[end] 1 else 0 end) isontreatment testresults left join treatmentdates b on a.patientid=b.patientid group a.patientid,a.[date],a.[value] in case, sum works because treatments never overlap. in other situations might want kind of thing, might not true. any has different purpose in sql server, there different window function tell me if any row has match, rather sum of matches?
only thing can think of wrap line in case statement:
select a.patientid ,a.[date] ,a.[value] ,case when sum(case when a.[date]>b.[start] , a.[date]<=b.[end] 1 else 0 end) >0 1 else 0 end isontreatment testresults left join treatmentdates b on a.patientid=b.patientid group a.patientid,a.[date],a.[value]
since don't take data treatments, simple exists should suffice:
select a.patientid, a.[date], a.[value], case when exists ( select 0 treatmentdates b a.patientid=b.patientid , a.[date]>b.[start] , a.[date]<=b.[end] ) 1 else 0 end [isontreatment] testresults a; if need columns treatments table, can move subquery outer apply , add top (1) it.
Comments
Post a Comment