基于优先级列表的列选择元素的聚合

Aggregation with column selecting element based on list of priorities

我想汇总一个元素列表,其中一栏是紧急情况。我想为每个项目获取一行,并根据列表(或映射)获取对该项目观察到的最高“紧急度”。

Item Urgency
A Normal
A Low
A High
B Normal
B Low
C High

预期输出:

Item Urgency
A High
B Normal
C High

这个想法就像聚合做一个“max()”,但由于紧迫性不是数字,我需要某种映射。

有办法一步完成吗?

另一种方法是创建一个带有 case when 子句的 CTE,以将每个紧急值映射到一个整数。但如果可能的话,我宁愿不做那个额外的步骤。

您可以使用 max_by 通过 Item 聚合分组和 case 语句将紧急程度映射到数值:

-- 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

输出:

Item Urgency
A High
B Normal
C High