如何使用子序列

时间:2018-04-25 02:05:50

标签: sql sql-server sql-server-2012 group-by sequence

我有一个包含列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但不知道如何使用它来完成我的任务。

1 个答案:

答案 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