我有一个实际上看起来像这样的数据表:
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。
答案 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;