2016-01-06 4 views
1

Я хочу получить значение символа «max» для столбца, используя оператор group by statement, за исключением вместо алфавитного порядка по умолчанию, я хочу настроить пользовательский порядок, который будет использовать max.Пользовательский заказ для Max()

Table1:

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 является одним из них. И никаких возражений против ответа Гордона, но вам придется использовать другую функцию окна, чтобы рассчитать порядок сортировки, если вам это тоже нужно.

Смежные вопросы