2016-01-06 66 views
1

我想使用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 

回答

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; 
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的回答没有异议,但是如果你也需要使用另一个窗口函数来计算排序顺序的话。