Группировать по и заменить - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть такая таблица:

groupe  subgroup    id  status
A          a       1    up
A          b       1    notdefined
A          c       1    null
A          a       2    up
A          b       2    up
A          c       2    up
A          a       3    up
A          b       3    up
A          c       3    null

Что мне нужно, так это чтобы каждая комбинация (идентификатор группы) возвращала указанный статус если для каждого (group, id) существует статус с notdefined, вернуть глобальный статус как notdefined

если все статус = вверх, вернуть глобальный статус = вверх если есть, но есть нулевой возврат, не указанный

так что результат должен быть таким

Groupe      id      global_status
A            1       notdefined
A            2        up
A            3        notspecified

Я пробовал что-то на sqlfiddle

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Использовать логические агрегаты:

select 
   groupe, 
   id, 
   case 
      when bool_and(status = 'up') then 'up' 
      when bool_or(status = 'notdefined') then 'notdefined' 
      else 'notpecified' 
   end as status
from tab
group by 1, 2
order by 1, 2

SqlFiddle.

0 голосов
/ 01 ноября 2018

Вы можете использовать агрегацию и условную логику:

select groupe, id,
       (case when count(*) filter (where status = 'notdefined') > 0
             then 'notdefined'
             when count(*) filter (where status is null) > 0
             then 'notspecified'
             when max(status) = min(status) and min(status) = 'up'
             then 'up'
             else 'something else'
        end) as global_status
from t
group by groupe, id;
...