如何通过重复计数逻辑处理row_number分区中的空列?

问题描述 投票:0回答:2

如何通过重复计数逻辑处理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
sql tsql
2个回答
1
投票

这不是关于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 != ''

0
投票

将你的查询分成两个帮助?

    SELECT
        * 
    FROM
        #t 
    WHERE
        ProgramName <> ''  

    UNION ALL  

    SELECT
        ProgramId,
        ProgramName,
        MAX(ProgramStatus) 
    FROM
        #t 
    WHERE
        ProgramName = '' 
    GROUP BY
        ProgramId,
        ProgramName

这是获得你想要的输出,但我刚刚选择了基于Max()的两个ProgramStatuses中的一个,你可能需要改变它

© www.soinside.com 2019 - 2024. All rights reserved.