首页 > 解决方案 > 如何从包含重复行的表中获取条件输出值

问题描述

我有一个表“系统”,如下所示:

+------+-------+-------------+
| id   | value | date        |
+------+-------+-------------+
| 1    | abc   | null        |
| 1    | xyz   | 20/8/2016   |
| 2    | ijh   | 15/07/2018  |
| 2    | mno   | 19/08/2017  |
+------+-------+-------------+

我希望通过运行 sql 查询得到这样的输出:

+------+-------+-------------+
| id   | value | date        |
+------+-------+-------------+
| 1    | abc   | null        |
| 2    | ijh   | 15/07/2018  | 
+------+-------+-------------+

如果重复的 id 值之一在日期列中有一个空值,那么我希望该特定行作为输出。如果两个日期列都有值,那么我想要包含最大日期的行。

我尝试了以下查询:

SELECT * FROM system 
WHERE 
    date IS NULL OR 
    NOT EXSISTS(select max(date) from system) 
GROUP BY id

标签: sqlsql-server

解决方案


处理此类查询的典型方法是使用row_number()

select t.*
from (select t.*,
             row_number() over (partition by id order by date desc nulls first) as seqnum
      from t
     ) t
where seqnum = 1;

您还没有指定您使用的数据库,所以我使用了 ANSI/ISO 标准结构。

ROW_NUMBER()产生一个序号。这对每个 id 重新开始——从 1 开始。数字根据ORDER BY子句增加 1。

编辑:

SQL Server 不支持NULLS LAST,所以你可以使用:

select t.*
from (select t.*,
             row_number() over (partition by id
                                order by (case when date is not null then 1 else 0 end), date desc
                               ) as seqnum
      from t
     ) t
where seqnum = 1;

推荐阅读