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

Posted

技术标签:

【中文标题】如何通过重复计数逻辑处理 row_number 分区中的空列?【英文标题】:How to handle empty column in row_number partition over by duplicate count logic? 【发布时间】:2019-03-26 22:36:09 【问题描述】:

在下面的查询中,ProgramID = 300 将有两次空 ProgramName。虽然还有其他行重复的记录,但我将不得不忽略它们。我将只需要选择 Empty 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

【问题讨论】:

样本数据和期望的结果真的很有帮助。 @GordonLinoff ,在上面的查询中 .. 预期 ID 为 100、200。而对于 300 .. 只有一行记录。每个 Id 都有重复的记录行。但是,在 300.. 我们只需要选择一行记录。这可能吗 【参考方案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 != ''

【讨论】:

谢谢@megadest.. 我错过了 OR 条件.. 这为我节省了很多.. 谢谢【参考方案2】:

将您的查询分成两个帮助吗?

    SELECT
        * 
    FROM
        #t 
    WHERE
        ProgramName <> ''  

    UNION ALL  

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

这是获得您想要的输出,但我只是选择了基于 Max() 的两个 ProgramStatuse 之一,您可能需要更改它

【讨论】:

以上是关于如何通过重复计数逻辑处理 row_number 分区中的空列?的主要内容,如果未能解决你的问题,请参考以下文章

hive 排序 分组计数后排序 几种不同函数的效果

MS Access - Row_Number 分区方式

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

如何在过程中使用 ROW_NUMBER() 对数据进行分页

jqgrid使用sql row_number进行分页

如何使用 ROW_NUMBER()?