Похоже, что это запрос расстановки приоритетов. Все строки, где пользователь не нулевой, плюс дополнительно одна строка на 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
);
Первая версия удобна, если ваши результаты являются результатом запроса, поскольку на результаты запроса ссылаются (и, следовательно, рассчитывают) только один раз.