根据 Varchar 字段从每个组中选择一行

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 或类似的东西对其进行排序。有没有更好/更喜欢的方法来做到这一点?

Jam*_*s Z 6

你可以这样做:

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)