首页 > 解决方案 > 如果另一列中的值存在,则删除某些匹配的行

问题描述

我有一个表格,其中的行看起来像这样

+---------------+-------------+------+-------+
| 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 语句,并且我想避免使用游标,因为它是一个相当大的文件。有任何想法吗?

标签: sqlsql-server

解决方案


您可以使用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;

推荐阅读