我想使用group by语句获取列的“max”字符值,但不是默认的字母顺序,我想设置max将使用的自定义顺序。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
我想使用group by语句获取列的“max”字符值,但不是默认的字母顺序,我想设置max将使用的自定义顺序。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
而是翻译来回,使用窗口功能:
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;
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是否是其中之一。对Gordon的回答没有异议,但是如果你也需要使用另一个窗口函数来计算排序顺序的话。