Sql 如何使用子序列列对列序列值重新编号
我有一个包含列StructureNumber和SubStructureNumber的表。StructureNumber按顺序编号,每个PropertyId从1开始 结构可以存在子结构,在这种情况下,SubStructureNumber将大于0,并且与父(顶级)结构具有相同的StructureNumber 顶级结构的子结构编号为0,而子结构(顶级结构的子结构)从1开始依次编号 示例数据:Sql 如何使用子序列列对列序列值重新编号,sql,sql-server,sql-server-2012,group-by,sequence,Sql,Sql Server,Sql Server 2012,Group By,Sequence,我有一个包含列StructureNumber和SubStructureNumber的表。StructureNumber按顺序编号,每个PropertyId从1开始 结构可以存在子结构,在这种情况下,SubStructureNumber将大于0,并且与父(顶级)结构具有相同的StructureNumber 顶级结构的子结构编号为0,而子结构(顶级结构的子结构)从1开始依次编号 示例数据: PropertyId | StructureNumber | SubStructureNumber 144
PropertyId | StructureNumber | SubStructureNumber
144 | 1 | 0
144 | 2 | 0
197 | 1 | 0
197 | 2 | 0
197 | 3 | 0
197 | 3 | 1
197 | 3 | 2
当属性的结构被删除时,挑战就来了。例如,如果删除了PropertyId 197的StructureNumber 2,我需要对该属性的结构重新编号以填充缺少的数字
PropertyId | StructureNumber | SubStructureNumber
197 | 1 | 0
197 | 3 | 0
197 | 3 | 1
197 | 3 | 2
同样,如果删除子结构,我需要为每个StructureNumber重新编号SubstructureNumber:
PropertyId | StructureNumber | SubStructureNumber
197 | 1 | 0
197 | 3 | 0
197 | 3 | 2
我知道如何使用CTE对StructureNumber进行重新编号,如中所示,使用如下方式:
DECLARE @PropertyId int = 197;
WITH Renumber AS
(
SELECT
StructureNumber,
ROW_NUMBER() OVER (ORDER BY os.StructureNumber DESC,
os.SubStructureNumber DESC) as StructureNumberNew
FROM dbo.parcel_OtherStructures os
WHERE os.PropertyId = @PropertyId
ORDER BY os.StructureNumber DESC, os.SubStructureNumber DESC
)
UPDATE Renumber SET StructureNumber = StructureNumberNew;
我只是不知道如何对每个StructureNumber的子结构编号进行重新编号,而不推进这些行的StructureNumber的ROW_NUMBER()值
我也看到有人提到使用稠密等级,但不知道如何使用它来完成我的任务。试试这个查询。我想这就是你要找的
select
*, dense_rank() over (partition by PropertyId order by StructureNumber) as StructureNumber
, row_number() over (partition by PropertyId, StructureNumber order by SubStructureNumber) - 1 as SubStructureNumber
from
myTable