代码之家  ›  专栏  ›  技术社区  ›  smpa01

如何在行数()TSQL中使用筛选

  •  3
  • smpa01  · 技术社区  · 4 年前

    序号
    1 山姆
    山姆
    山姆 诺顿霍尔德
    4 山姆 搁置
    5 搁置
    艾伦
    艾伦 搁置
    8 诺顿霍尔德
    9 诺顿霍尔德
    10

    序号 名称 等级
    1 搁置 1
    2 山姆 2
    山姆
    4 搁置
    5 搁置 1
    艾伦 诺顿霍尔德
    艾伦 搁置
    8 诺顿霍尔德 无效的
    9 伊利斯 诺顿霍尔德
    10 伊利斯 诺顿霍尔德 无效的

    我可以通过做以下事情来达到预期的结果

    declare @t1 TABLE (SN int, name varchar(10), status varchar(10))
    INSERT INTO @t1
    Select SN, name,status
    from
    (
    VALUES 
    (1, 'Sam', 'OnHold'), 
    (2, 'Sam', 'OnHold'), 
    (3, 'Sam', 'NotOnHold'), 
    (4, 'Sam', 'OnHold'), 
    (5, 'Alan', 'OnHold'), 
    (6, 'Alan', 'NotOnHold'), 
    (7, 'Alan', 'OnHold'), 
    (8, 'Elis', 'NotOnHold'), 
    (9, 'Elis', 'NotOnHold'), 
    (10, 'Elis', 'NotOnhold')
    ) t (SN, name,status)
    
    
    select * from
    
    (select SN, name, status, ROW_NUMBER() OVER (PARTITION BY name ORDER BY SN) as rank from @t1 where   status='OnHold'
    union all
    select SN, name, status, null as rank from @t1 where status<>'OnHold') a
    ORDER BY SN
    

    但是,有没有更好的优化方法,一次达到预期的结果,而不必使用联合所有。

    我试过下面的方法,但没有给我想要的

    select SN, name, status, CASE when status='OnHold' then ROW_NUMBER() OVER (PARTITION BY name ORDER BY SN) else NULL end as RANK from @t1 order by SN
    

    先谢谢你。

    1 回复  |  直到 4 年前
        1
  •  1
  •   Thom A    4 年前

    你需要一个 CASE

    SELECT SN,
           [name],
           [Status],
           CASE [status] WHEN 'OnHold' THEN RANK() OVER (PARTITION BY [name], [status] ORDER BY SN) END AS Rank
    FROM @t1 t1
    ORDER BY SN;