pea*_*dog 5 sql-server greatest-n-per-group sql-server-2014
给定一个Avenger数据如下所示的表:
id Avenger Type Power
1 Captain America foo 2
2 Captain America bar 3
3 Me foo 5
4 You foo 1
5 You bar 7
6 Iron Man foo 4
Run Code Online (Sandbox Code Playgroud)
我想返回一个不同的复仇者联盟结果集,尽管表中的所有其他数据都与我的处理兴趣相关。出于商业原因,我想Type在适用的情况下返回“bar”类型的记录而不是“foo”。
我可以分两步做到这一点,当然:
declare @avenger table
(
id int,
Avenger varchar(50),
[Power] varchar(50),
[Type] varchar(50)
)
insert into @avenger
select * from Avenger where Type = 'bar'
insert into @avenger
select t.ID, t.Avenger, t.Type, t.Power from Avenger as t
where t.Avenger not in (select Avenger from @avenger)
Run Code Online (Sandbox Code Playgroud)
然后从@avenger 返回我的结果集。因为我需要来自Avenger(例如Power)a的其他字段UNION似乎是不可能的。 Type是 varchar 数据,虽然现在有 2 个,但将来可能会有更多,所以我不确定是否尝试基于 alpha 或类似的东西对其进行排序。有没有更好/更喜欢的方法来做到这一点?
你可以这样做:
select * from (
select *, row_number() over (partition by Avenger order by Type) as RN
) X
where RN = 1
Run Code Online (Sandbox Code Playgroud)
这将为每个复仇者的行编号,对于您的实际业务案例,如果有超过 2 个不同的值,您很可能需要按顺序使用 case 语句来定义它们的优先级:
....order by case Type when 'bar' then 1 when 'foo' then 2 else 3 end
Run Code Online (Sandbox Code Playgroud)