I'm using SQL Server and I have table like this:
| id | size | reign |
|---|---|---|
| 1 | large | Riyadh |
| 1 | small | Riyadh |
| 2 | large | Makkah |
| 2 | medium | Makkah |
| 2 | small | Jeddah |
| 3 | medium | Dammam |
I want a query to take only one size for each regain and id. For example in id "1", I want to remove the second value ("small") Notice: I can't alter or make changes in the table.
The result should be like this:
| id | size | reign |
|---|---|---|
| 1 | large | Riyadh |
| 2 | large | Makkah |
| 2 | small | Jeddah |
| 3 | medium | Dammam |
CodePudding user response:
Assuming you want to prioritize large, medium, and small, in this order, we can try using ROW_NUMBER as follows:
WITH cte AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY id, reign
ORDER BY CASE size WHEN 'large' THEN 1
WHEN 'medium' THEN 2
WHEN 'small' THEN 3 END) rn
FROM yourTable
)
SELECT id, size, reign
FROM cte
WHERE rn = 1
ORDER BY id;
CodePudding user response:
If your data is always in this simple form (meaning there are those three sizes only) and if you always want to select large first if present, else medium first if present and last small, this can just be done using MIN and GROUP BY with a good ORDER BY clause:
SELECT id, MIN(size) AS size, reign
FROM yourtable
GROUP BY id, reign
ORDER BY id, size;
This query will produce exactly the result shown in your question.
Verify this here: db<>fiddle
If this logic is not sufficient to meet your requirements, please edit your question and explain more detailed what you need.
