SQL-根据条件和优先级返回唯一行

时间:2018-10-29 14:13:00

标签: sql sql-server

我有一个实际上看起来像这样的数据表:

Team          Shirt Number     Name
1                 1            Seaman
1                 13           Lucas
2                 1            Bosnic
2                 14           Schmidt
2                 23           Woods
3                 13           Tubilandu
3                 14           Lev
3                 15           Martin

我要按照以下逻辑删除球队的重复项-如果球衣号码为“ 1”,请使用该号码。如果不是,则寻找13。如果不是,则寻找14。

我意识到这可能是非常基本的,但是我似乎在case语句方面没有取得任何进展。我知道这与子查询和案例陈述有关,但是我很挣扎,感谢您提供的任何帮助!

使用SSMS。

3 个答案:

答案 0 :(得分:3)

由于您没有指定任何DBMS,因此让我假设row_number()可以满足要求:

DELETE 
FROM (SELECT t.*,
             ROW_NUMBER() OVER (PARTITION BY Team  
                                ORDER BY (CASE WHEN Shirt_Number = 1
                                               THEN 1 
                                               WHEN Shirt_Number = 13
                                               THEN 2
                                               WHEN Shirt_Number = 14
                                               THEN 3
                                               ELSE 4
                                          END)
                               ) AS Seq
      FROM table t
     ) t
WHERE Seq = 1;

假设Shirt_Number之间有一个空隙,而其他地方仅order by Shirt_Number就足够了。

答案 1 :(得分:1)

我认为您正在寻找partition by子句用法。下面的解决方案在Sql Server中有效。

create table #eray
(team int, shirtnumber int, name varchar(200))

insert into #eray values
(1,               1,            'Seaman'),
(1,              13,            'Lucas'),
(2,               1,            'Bosnic'),
(2,              14,            'Schmidt')

;with cte as (
   Select Team, ShirtNumber, Name, 
          ROW_NUMBER() OVER (PARTITION BY Team ORDER BY ShirtNumber ASC) AS rn
   From #eray 
   where ShirtNumber in (1,13,14)
)
select * from cte where rn=1

答案 2 :(得分:0)

如果有团队表,则可以使用cross apply

select ts.*
from teams t cross apply
     (select top (1) ts.*
      from teamshirts ts
      where ts.team = t.team
      order by (case shirt_number when 1 then 1 when 13 then 2 when 14 then 3 else 4 end)
     ) ts;

如果您没有2到12之间的数字,可以将其简化为:

select ts.*
from teams t cross apply
     (select top (1) ts.*
      from teamshirts ts
      where ts.team = t.team
      order by shirt_number
     ) ts;
相关问题