Max()的自定义订单

时间:2016-01-06 18:36:29

标签: sql postgresql

我想得到" 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

2 个答案:

答案 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;