oracle 使用Min和Max删除重复行,以及如何处理空值

qco9c6ql  于 2023-03-01  发布在  Oracle
关注(0)|答案(1)|浏览(278)

我正在Oracle中创建一个SQL查询,并尝试在case语句中使用min和max聚合函数删除重复行。以下是当前状态下的代码:

select 
   Student_number,
       case 
       when min(sr.racecd) = max(sr.racecd) then min(sr.racecd) else 'Two or more races' 
   end as races

输出如下所示

Student Number   Race
4322             two or more races
4324             White

当我运行代码时,它将多行合并为一行,并将名称更改为“two or more races”。但是,我遇到的问题是,当它遇到空值时,它也将其更改为“Two or more races”。我如何保持空值不变,或将其更改为未知?另外,当我向查询中添加其他列时,聚合函数的工作方式与我仅查询studentnumber和racecd时的工作方式不同,这是为什么呢?

nukf8bse

nukf8bse1#

因为NULL不等于任何值,所以如果相等性测试失败,则会转到THEN子句。有很多解决方案。一种是使用COUNT,它忽略NULL,如下所示:

select 
   Student_number,
       CASE WHEN (COUNT(DISTINCT sr.raced) > 1) THEN 'Two or more races'
            ELSE MAX(sr.racecd)
       END
   end as races

至于添加列的问题,当您添加未聚合的列时,您将被迫将它们包含在GROUP BY中。这会更改查询的粒度和每个组中包含的行,因此会影响结果。如果您想要除student_number之外的更多有关student的信息,您将需要聚合其他列(例如,使用MAX())。

相关问题