Исключение дублирующихся строк с нулевыми значениями с помощью предложения with - PullRequest
0 голосов
/ 20 февраля 2019

Как исключить дубликаты, выбрав только те, у которых есть значения в определенном поле, с помощью оператора выражения?

Запрос выглядит примерно так:

with x as (--queries with multiple join tables, etc.)
select distinct * from x

Вывод ниже:

Com_no   Company      Loc    Rewards
1         Mccin      India      50
1         Mccin      India
2         Rowle      China      18
3         Draxel     China      11
3         Draxel     China  
4         Robo       UK          

Как видите, я получаю дубликаты записей.Я хочу избавиться от нулевых значений, которые НЕ являются уникальными.То есть Robo уникален, поскольку в Rewards есть только 1 запись с нулевым значением, поэтому я хочу сохранить это.

Я пробовал это:

 with x as (--queries with multiple join tables, etc.)
 select distinct * from x where Rewards is not null

И, конечно,это было неправильно, поскольку он также избавился от 4 Robo UK

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

1         Mccin      India      50
2         Rowle      China      18
3         Draxel     China      11 
4         Robo       UK      

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Это запрос расстановки приоритетов.Одним из способов является использование row_number().Если вам нужно только одно значение на Com_no / Company / Loc, то:

select x.*
from (select x.*,
             row_number() over (partition by Com_no, Company, Loc order by Rewards nulls last) as seqnum
      from x
     ) x
where seqnum = 1;

Или даже:

select Com_no, Company, Loc, max(Rewards)
from x
group by Com_no, Company, Loc;
0 голосов
/ 20 февраля 2019

Проблема в том, что вы называете эти строки дубликатами, но они не являются дубликатами.Они разные.Итак, вы хотите исключить строки, где Rewards равно нулю, ЕСЛИ нет строк с ненулевым значением, а затем выберите отдельные строки.Итак, что-то вроде:

select distinct * 
from x a
where Rewards is not null 
or (Rewards is null and not exists (select 1 from x b where a.Com_no = b.Com_no 
    and b.Rewards is not null)

Теперь ваша строка Robo будет по-прежнему включена, поскольку в Robo нет строки в x для Robo, где Rewards не является нулевым, но строки для других компаний с нулевыми Rewards будутисключено, поскольку для них нет пустых строк.

...