SQL不同的记录但过滤一个字段的空值

时间:2016-07-12 18:11:31

标签: sql oracle

我是SQL的新手并在这里寻求帮助。请看第一个截图。除country字段外,前两个记录具有精确值。第二个屏幕截图是我想要检索的。我想获得第一个(非空country)。我还想保留第三条记录,因为它是id 345的唯一记录,尽管它有一个空country。我尝试了以下查询,但没有得到我想要的结果。 enter image description here

DESIRED RESULT

SELECT DISTINCT id, first, last, age, gender, city, state, zip
FROM Person
WHERE country IS NOT NULL

2 个答案:

答案 0 :(得分:1)

您可以使用row_number分析功能执行此操作。

id分区然后按rn = 1过滤,我们确保每个不同的id值不会超过一行。

order by函数中的row_number子句决定返回哪个行。在这种情况下,具有非空country值的行优先。如果您有更复杂的规则来确定要按id返回哪一行,请相应地调整order by子句。

select id, first, last, age, gender, city, state, zip, country
  from (select id, first, last, age, gender, city, state, zip, country
               row_number() over(
                 partition by id
                     order by case when country is not null then 1 else 2 end) as rn
          from tbl)
 where rn = 1

答案 1 :(得分:1)

这样的东西
select   id, first, last, age, gender, city, state, zip, min(country)
from     persons
group by id, first, last, age, gender, city, state, zip

应该可以工作,因为默认情况下,varchar2值的顺序是升序,空值是最后的。