我们如何通过使用with子句语句仅选择某个字段中具有值的重复项来消除重复项?
查询是这样的:
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
答案 0 :(得分:1)
这是一个优先级查询。一种方法是使用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;
答案 1 :(得分:0)
问题在于您将这些行称为重复项,但它们并非重复项。他们不同。因此,您想要做的是排除Rewards
为null的行,除非没有不具有非null值的行,然后选择不同的行。像这样:
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中x中没有奖励不为空的行,但是其他奖励为空的公司的行将被排除,因为它们的行不为空。