ID | Status |
---|---|
1 | Active |
1 | Inactive |
2 | Active |
3 | Inactive |
4 | Active |
4 | Inactive |
In the above table when id has multiple status, need only the records with status as Active along with the remaining records.
ID | Status |
---|---|
1 | Active |
2 | Active |
3 | Inactive |
4 | Active |
CodePudding user response:
This is a "top 1 per group" problem I think, if I've interpreted your expected results correctly (I don't quite follow the question body).
; -- ensure prior statement is terminated; see sqlblog.org/cte
WITH src AS
(
SELECT ID, Status, rn = ROW_NUMBER()
OVER (PARTITION BY ID ORDER BY Status)
FROM dbo.table_name
)
SELECT ID, Status FROM src WHERE rn = 1;
It just so happens that Active
sorts before Inactive
but if you wanted to rely on something other than coincidental alphanumeric ordering, you could say:
OVER (PARTITION BY ID ORDER BY CASE Status
WHEN 'Active' THEN 1
WHEN 'Inactive' THEN 2
END
)
CodePudding user response:
You can also try, With an INDEX on [ID] and [Status] it would be quite fast
SELECT [ID],[Status] FROM tabl1 WHERE [Status] = 'Active' UNION ALL SELECT [ID],[Status] FROM tabl1 t1 WHERE NOT EXISTS(SELECT 1 FROM tabl1 WHERE [Status] = 'Active' AND [ID] = t1.[ID])
ID | Status -: | :------- 1 | Active 2 | Active 4 | Active 3 | Inactive
db<>fiddle here