SQL - Выберите по уровню или является родительским, когда ноль - PullRequest
0 голосов
/ 21 октября 2019

Я делаю запрос, где у меня есть следующие данные:

enter image description here

Я хочу получить данные по уровню. То есть, если столбец «Пользователь» не равен NULL, я хочу, чтобы возвращалась ваша комбинация Business + Type + Class.

В свою очередь, если столбец «User» имеет значение NULL, я хочу, чтобы Business + Type + ClassКомбинация должна быть получена из столбца Агентство.

Наконец, если столбец «Пользователь» и столбец «Агентство» имеют значение NULL, я хочу вернуть комбинацию из столбца «Страна».

Ожидаемый результат - зеленые линии:

enter image description here

Кто-нибудь может мне помочь? Спасибо!

1 Ответ

1 голос
/ 21 октября 2019

Похоже, что это запрос расстановки приоритетов. Все строки, где пользователь не нулевой, плюс дополнительно одна строка на null. Один из методов - row_number():

select t.*
from (select t.*,
             row_number() over (partition by business, type, agency order by userid desc) as seqnum
      from t
     ) t
where seqnum = 1 or user is not null;

. desc ставит нулевые значения последними в последовательности, поэтому они отфильтровываются с помощью where.

. Другой подход использует union all и not exists:

select t.*
from t
where t.user is not null
union all
select t.*
from t
where t.user is null and
      not exists (select 1
                  from t t2
                  where t2.business = t.business and
                        t2.type = t.type and
                        t2.class = t.class and
                        t2.user is not null
                 );

Первая версия удобна, если ваши результаты являются результатом запроса, поскольку на результаты запроса ссылаются (и, следовательно, рассчитывают) только один раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...