Given a table with following schema:
RecordId | ProcessId | Data |
---|---|---|
80830F00-379C-11EA-96B7-372060281AFC | 1 | 4.2 |
80830F00-379C-11EA-96B7-372060281AFC | 2 | 445588662211448 |
80830F00-379C-11EA-96B7-372060281AFC | 7 | 1 |
791F6D30-379C-11EA-96B7-372060281AFC | 1 | 3.3 |
791F6D30-379C-11EA-96B7-372060281AFC | 2 | 999999999999999 |
791F6D30-379C-11EA-96B7-372060281AFC | 7 | 2 |
So the RecordId
represents some grouping key and each ProcessId
has its Data
.
Now I have a filter which looks like this:
filter: [ { "1": "3.3" }, { "2": "999999999999999" } ]
So the key
is ProcessId
and value
is Data
.
Question
How can I get all RecordId
s which satisfies query meaning that each group (grouped by RecordId
) should contain specific processes with specific data.
I believe it should be used like this:
SELECT RecordId FROM [SomeTable] GROUP BY RecordId HAVING --- the row with ProcessId = 1 AND Data = '3.3' AND --- the row with ProcessId = 2 AND Data = '999999999999999'
Advertisement
Answer
You can use having
with case
:
SELECT RecordId FROM [SomeTable] GROUP BY RecordId HAVING SUM(CASE WHEN ProcessId = 1 AND Data = '3.3' THEN 1 ELSE 0 END) > 0 AND SUM(CASE WHEN ProcessId = 2 AND Data = '999999999999999' THEN 1 ELSE 0 END) > 0;