sql - 如何从包含重复行的表中获取条件输出值
问题描述
我有一个表“系统”,如下所示:
+------+-------+-------------+
| 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
解决方案
处理此类查询的典型方法是使用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;
推荐阅读
- rest - IBM Maximo REST 服务 POST 未在 MBO 上设置属性
- python - 在锦标赛中获得尽可能多的球员比赛组合
- laravel - Laravel 6 执行基于角色的路由
- c# - 菜单单击未触发其绑定命令
- swift - Why is UIImage nil if i have the Data
- excel - Running VBA functions in a specific order
- c# - 我的 Post 表单没有到达我的 asp.net mvc 核心 Web 应用程序中的操作方法
- swift - 不同类型对象数组的 SwiftUI 抽象视图
- node.js - 根据现有的创建和检查唯一名称
- angular - 在 Ionic 和 Angular 中创建表单时收到错误