удалить результаты из запроса, если группа пуста - PullRequest
2 голосов
/ 25 января 2020

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

Критерии:

Не показывать результаты для grpid, если для всех grpid есть null custuserid

grpid 145 должно быть видно, как есть custuserid во втором ряду.

Custid    grpid   custuserid   date
  101       145                12/30/19
  101       145     dellf      1/1/20
  101       255     dellf      1/1/20
  201       456                1/1/20
  201       555     smithr     1/1/20

вывод:

Custid    grpid   custuserid   date
  101       145                12/30/19
  101       145     dellf      1/1/20
  101       255     dellf      1/1/20
  201       555     smithr     1/1/20

Лучший способ отфильтровать эти результаты?

Я думал, first_value можно использовать, но есть ли лучший способ?

Ответы [ 2 ]

1 голос
/ 25 января 2020

Попробуйте запрос ниже

select * from temp1 where grpid not in (select grpid from temp1 group by grpid having count(custorid)=0)
1 голос
/ 25 января 2020

Я бы просто использовал exists:

select t.*
from mytable t
where exists (
    select 1 from mytable t1 where t1.grpid = t.grpid and t1.custuserid is not null
)

Коррелированный подзапрос гарантирует, что хотя бы одна запись с тем же grpid имеет ненулевое значение custuserid. Для производительности вам нужен индекс на (grpid, custuserid).

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

select *
from (
    select t.*, max(custuserid) over(partition by grpid) max_custuserid 
    from mytable t
) t
where max_custuserid is not null

Или вы можете присоединиться к агрегированному запросу:

select t.*
from mytable t
inner join (
    select 
        grpid, 
        max(custuserid) 
    from mytable 
    group by grpid 
    having max(custuserid) is not null
) x on x.grpid = t.grpid

Какой вариант будет работать лучше всего, зависит от набора данных (размер, количество элементов, ...).

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