我想得到" max"使用group by语句的列的字符值,除了默认的字母顺序,我想设置max将使用的自定义排序。
表1:
ID | TYPE
-----+-------
1 | A
1 | B
1 | C
2 | A
2 | B
我希望按ID分组并按C,A,B的顺序获取最大值(类型)。预期结果:
ID | MAX_TYPE
-----+-----------
1 | C
2 | A
答案 0 :(得分:1)
select
id,
case
max(
case max_type
when 'C' then 3 when 'A' then 2 when 'B' then 1
end
)
when 3 then 'C' when 2 then 'A' when 1 then 'B'
end as max_type
from T
group by id
转换为按max()
排名的值,然后转换回原始值。
如果您还想按该值对结果进行排序,则可以添加:
order by
max(
case max_type
when 'C' then 3 when 'A' then 2 when 'B' then 1
end
) desc
某些平台要求将排序列包含在输出中。我不确定PostgreSql是否是其中之一。并且不反对戈登的答案,但如果你需要,你还必须使用另一个窗口函数来计算排序顺序。
答案 1 :(得分:1)
不使用来回翻译,而是使用窗口函数:
select t.*
from (select t.*,
row_number() over (partition by id
order by (case when type = 'C' then 1
when type = 'A' then 2
when type = 'B' then 3
end) as seqnum
from t
) t
where seqnum = 1;
根据值的样子,您还可以使用字符串函数简化:
select t.*
from (select t.*,
row_number() over (partition by id
order by position(type, 'CAB')) as seqnum
from t
) t
where seqnum = 1;