gpt4 book ai didi

sql-server - 如何在 ROW_NUMBER() SQL 中使用过滤

转载 作者:行者123 更新时间:2023-12-04 03:33:29 27 4
gpt4 key购买 nike

我有一个源表如下

<表类="s-表"><头>序列号名字状态<正文>1山姆暂停2山姆暂停3山姆不挂起4山姆暂停5艾伦暂停6艾伦不挂起7艾伦暂停8爱丽丝不挂起9爱丽丝不挂起10爱丽丝不搁置

我想对按名称分组的 OnHold 状态的行使用 ROW_NUMBER() 函数。我想要的输出如下

<表类="s-表"><头>序列号姓名状态排名<正文>1山姆暂停12山姆暂停23山姆不挂起空4山姆暂停35艾伦暂停16艾伦不挂起空7艾伦暂停28爱丽丝不挂起空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

但是否有更好的优化方法来立即达到预期的结果,而无需完全使用 Union。

我尝试了以下方法,但它没有给我想要的东西

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

在此先感谢您。

最佳答案

您可以使用 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;

关于sql-server - 如何在 ROW_NUMBER() SQL 中使用过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67405165/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com