如何通过重复计数逻辑处理row_number分区中的空列?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何通过重复计数逻辑处理row_number分区中的空列?相关的知识,希望对你有一定的参考价值。
如何通过重复计数逻辑处理row_number分区中的空列?
在下面的查询中,ProgramID = 300将具有两次空ProgramName。虽然还有其他行记录重复,但我必须忽略它们。我将只需要选择空程序名,并且它出现两次的相应ProgramId只能显示一组记录。
这6行插入记录的预期输出将是5行记录。在这5个中,1行记录具有空程序名称。
if object_id('tempdb.dbo.#t') is not null
drop table #t
Create table #t
(
ProgramId int,
ProgramName nvarchar(100),
ProgramStatus nvarchar(100)
)
Insert into #t ( ProgramId,ProgramName, ProgramStatus ) values ( 100, 'Test100', 'TestCompleted' )
go
Insert into #t ( ProgramId,ProgramName, ProgramStatus ) values ( 100, 'Test100', 'TestCompleted' )
go
Insert into #t ( ProgramId,ProgramName, ProgramStatus ) values ( 200, 'Test200', 'TestCompleted' )
go
Insert into #t ( ProgramId,ProgramName, ProgramStatus ) values ( 200, 'Test200', 'TestCompleted' )
go
Insert into #t ( ProgramId,ProgramName, ProgramStatus ) values ( 300, '', 'Progress' )
go
Insert into #t ( ProgramId,ProgramName, ProgramStatus ) values ( 300, '', 'TestCompleted' )
go
select * from #t
答案
这不是关于ROW_NUMBER()的问题,问题似乎是关于编写下游的WHERE子句......
with selector as (
SELECT *
, ROW_NUMBER() OVER (PARTITION BY ProgramName ORDER BY ProgramStatus DESC) as rn
-- though it would be good to order by something more useful, like timestamp
)
select *
from selector
where rn=1 OR ProgramName != ''
另一答案
将你的查询分成两个帮助?
SELECT
*
FROM
#t
WHERE
ProgramName <> ''
UNION ALL
SELECT
ProgramId,
ProgramName,
MAX(ProgramStatus)
FROM
#t
WHERE
ProgramName = ''
GROUP BY
ProgramId,
ProgramName
这是获得你想要的输出,但我刚刚选择了基于Max()的两个ProgramStatuses中的一个,你可能需要改变它
以上是关于如何通过重复计数逻辑处理row_number分区中的空列?的主要内容,如果未能解决你的问题,请参考以下文章