sql - 如果另一列中的值存在,则删除某些匹配的行
问题描述
我有一个表格,其中的行看起来像这样
+---------------+-------------+------+-------+
| ID | Name | EL | STRM |
+---------------+-------------+------+-------+
| 1 | Tilley | 1 | 1150 |
| 1 | Tilley | 2 | 1170 |
| 1 | Tilley | 1 | 1190 |
| 2 | Lin | 1 | 1170 |
| 2 | Lin | 1 | 1190 |
| 3 | Jake | 2 | 1170 |
| 4 | Sue | 1 | 1150 |
| 4 | Sue | 1 | 1190 |
| 5 | Jill | 2 | 1150 |
+---------------+-------------+------+-------+
我需要使每个唯一 ID 中的 1 个都在表中,但我需要它的顺序不是ASC
, 或DESC
.
例如,我的主要值是 1170,如果该值存在,则删除所有其他值并保留该值,但如果它不存在,则下一个重要值是 1190,最后是 1150。最后,表格应如下所示:
+---------------+-------------+------+-------+
| ID | Name | EL | STRM |
+---------------+-------------+------+-------+
| 1 | Tilley | 2 | 1170 |
| 2 | Lin | 1 | 1170 |
| 3 | Jake | 2 | 1170 |
| 4 | Sue | 1 | 1190 |
| 5 | Jill | 2 | 1150 |
+---------------+-------------+------+-------+
我尝试了 order by,但我似乎无法获得可以执行此操作的 SQL 语句,并且我想避免使用游标,因为它是一个相当大的文件。有任何想法吗?
解决方案
您可以使用row_number()
:
select t.*
from (select t.*,
row_number() over (partition by id
order by case when strm = 1170 then 1
when strm = 1190 then 2
when strm = 1150 then 3
else 4
end
) as seqnum
from t
) t
where seqnum = 1;
推荐阅读
- security - 如何修复此 GitHub 安全警报?
- asynchronous - 使用 Jest 在 Redux 中测试异步操作创建器(使用 axios)
- reactjs - 如何使用reactjs显示从sideBar到内容组件的路由器结果?
- javascript - 如何通过添加表格行来添加日期的唯一 ID
- laravel - Laravel Homestead 警告:Vagrant 身份验证失败
- r - 如何取消列出 lm 拟合以制作箱线图?
- django - 使用来自多个来源的 docker 进行多阶段构建
- c# - 如何形成唯一标识符?
- mongodb - MongoDB 删除或限制字段条件聚合
- r - 如何移动R图例中的符号