Say I have the following table:
CaseRef | NotificationReason | NotificationDate |
---|---|---|
123 | SCHEDULED | 2022-01-01 |
234 | SCHEDULED | 2022-01-02 |
312 | SCHEDULED | 2022-01-01 |
123 | RESCHEDULED | 2022-01-02 |
123 | DECIDED | 2022-01-03 |
234 | DECIDED | 2022-01-02 |
If I want to return only rows that have a CaseRef
that has both a SCHEDULED
and a DECIDED
value in NotificationReason
.
CaseRef | NotificationReason | NotificationDate |
---|---|---|
234 | SCHEDULED | 2022-01-02 |
234 | DECIDED | 2022-01-02 |
123 | SCHEDULED | 2022-01-01 |
123 | RESCHEDULED | 2022-01-02 |
123 | DECIDED | 2022-01-03 |
I wrote the below which works fine and only excludes the one row, but I was wondering if this is the most efficient way of constructing such a query?
SELECT * FROM @Notifications WHERE CaseRef IN (SELECT CaseRef FROM @Notifications WHERE NotificationReason = 'SCHEDULED') AND CaseRef IN (SELECT CaseRef FROM @Notifications WHERE NotificationReason = 'DECIDED') ORDER BY CaseRef DESC
Thanks.
Advertisement
Answer
Your query should be reasonably fast for checking two statuses. But in case you want to check many statuses an alternate would be:
select * from t where caseref in ( select caseref from t where notificationreason in ('SCHEDULED', 'DECIDED') group by caseref having count(distinct notificationreason) = 2 )