I would like to aggregate a list of elements where one column is the urgency. I would like to get a row for each item and take the highest “Urgency” observed for that item based on a list (or mapping).
Item | Urgency |
---|---|
A | Normal |
A | Low |
A | High |
B | Normal |
B | Low |
C | High |
Expected output:
Item | Urgency |
---|---|
A | High |
B | Normal |
C | High |
The idea would be like aggregate doing a “max()”, but since the urgency is not numerical, I would need some kind of mapping.
Is there a way to do this in one step?
An alternative would be to create a CTE with a case when clause to map each urgency value to an integer. But if possible, I would prefer to do it without that additional step.
Advertisement
Answer
You can use max_by
aggregate over grouping by Item
with case
statement to map urgency into numeric value:
-- sample data WITH dataset (Item, Urgency) AS ( VALUES ('A', 'Normal'), ('A', 'Low'), ('A', 'High'), ('B', 'Normal'), ('B', 'Low'), ('C', 'High') ) -- query select Item, max_by( Urgency, case Urgency when 'Low' then 1 when 'Normal' then 2 when 'High' then 3 end ) Urgency from dataset group by Item order by Item
Output:
Item | Urgency |
---|---|
A | High |
B | Normal |
C | High |