SQL Oracle: Фильтрация по условиям в группе

Имею таблицу следующего вида,

   a   b   c   d    f
  apple qw  er null null
  apple qw  er 123 456
  pear  ed  rt 342 234
  pear  ed  rt 675 897
  pear  ed  rt 786 876
  plum ed  rt null null
  plum ed  rt null null
 

на выходе пытаюсь получить:

   a   b   c   d    f
  apple qw  er null null
  apple qw  er 123 456

возможно ли как-то в селекте отфильтровать строки группы, при этом в этой группе должна быть хотя бы по одной строке со значением null и не равно null для колонки d, в какую сторону лучше смотреть? возможно ли как-то получить через case или в сторону оконных функций?


Ответы (1 шт):

Автор решения: Akina
WITH cte As (
    SELECT a,b,c,d,f,
           SUM(CASE WHEN d IS NULL THEN 0 ELSE 1 END) OVER (PARTITION BY a,b,c) non_nulls,
           SUM(CASE WHEN d IS NULL THEN 1 ELSE 0 END) OVER (PARTITION BY a,b,c) nulls
    FROM test
)
SELECT a,b,c,d,f
FROM cte
WHERE nulls > 0 AND non_nulls > 0

https://dbfiddle.uk/?rdbms=oracle_11.2&fiddle=f2f7e04c5ffa80fa693d29f132099003

→ Ссылка