如何通过重复计数逻辑处理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分区中的空列?的主要内容,如果未能解决你的问题,请参考以下文章

MS Access - Row_Number 分区方式

SQL Server:row_number 分区不重置计数器

SQL 最近在分区上使用 row_number()

如何将可重复的分区作为一个又一个分区的新分区?

如何在外部选择语句中使用 row_number 分区?

BigQuery 重复数据删除和分区表