Проблема PostgreSQL в запросе Case Priority - PullRequest
0 голосов
/ 15 мая 2018

Я использую PostgreSQL. Я застрял в построении запроса. Как мы можем искать результат, отдавая приоритет данным и отбрасывая остальные данные, если какой-либо из приоритетов соответствует случаям?

Группировка по семьям

Если у одного человека в семье есть уровень приверженности «ИЗБИРАТЕЛЬ», то его следует выбирать, а не другого человека в той же семье, чей статус отличается, например «УТВЕРЖДЕН», «ПОВТОРИТЬ» или «НЕЙТРАЛЬНО»

Если у одного человека в семье есть уровень обязательств «УТВЕРЖДЕНО», то его следует выбрать, а не у другого человека в той же семье, чей статус отличается, например, «ПЕРЕХОД» или «НЕЙТРАЛЬНО»

Эта иерархия выглядит следующим образом: «ИЗБИРАТЕЛЬ», «СОВЕРШЕНО», «ВЫХОД», «НЕЙТРАЛЬНО». Если все члены семьи имеют одинаковый уровень приверженности, то должен быть выбран номер мобильного телефона, если не ноль.

Другие отбрасываются

Пример таблицы с данными

ID  COMMITTED LEVEL MOBILE NUMBER   FAMILY NUMBER
1   VOTER               234828288       1
2   COMMITED            262349911       1
3   COMMITED            924792922       2
4   REACHOUT            82639472        2
5   VOTER               79246826234     3
6   VOTER               NULL            3

ВЫХОД: ожидаемый результат

ID  COMMITED LEVEL      MOBILE NUMBER   FAMILY NUMBER
1   VOTER               234828288       1
3   COMMITED            924792922       2
5   VOTER               79246826234     3

1 Ответ

0 голосов
/ 15 мая 2018

Вы можете сделать это, используя distinct on:

select distinct on (family_number) t.*
from t
order by family_number,
         (case when committed_level = 'Voter' then 1
               when committed_level = 'COMMITTED' then 2
               when committed_level = 'REACHOUT' then 3
               when committed_level = 'Neutral' then 4
               else 5
          end),
         (case when mobile_number is not null then 1 else 2 end);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...