我有一个包含列StructureNumber和SubStructureNumber的表。对于每个PropertyId,StructureNumbers从1开始按顺序编号。
子结构可以存在于结构中,在这种情况下,SubStructureNumber将是> 0,具有与父(顶级)结构相同的StructureNumber。
顶级结构的SubStructureNumber为0,而SubStructures(顶级结构的子级)从1开始按顺序编号。
示例数据:
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重新编号SubStructureNumbers:
PropertyId | StructureNumber | SubStructureNumber
197 | 1 | 0
197 | 3 | 0
197 | 3 | 2
我知道如何使用CTE重新编号StructureNumbers,如this post所示,使用类似的东西:
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重新编号SubStructureNumbers而不提高这些行的StructureNumber的ROW_NUMBER()值。
我看到提到使用DENSE_RANK但不知道如何使用它来完成我的任务。
答案 0 :(得分:0)
尝试此查询。我想这就是你要找的东西
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