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