Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何使用子序列列对列序列值重新编号_Sql_Sql Server_Sql Server 2012_Group By_Sequence - Fatal编程技术网

Sql 如何使用子序列列对列序列值重新编号

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

我有一个包含列StructureNumber和SubStructureNumber的表。StructureNumber按顺序编号,每个PropertyId从1开始

结构可以存在子结构,在这种情况下,SubStructureNumber将大于0,并且与父(顶级)结构具有相同的StructureNumber

顶级结构的子结构编号为0,而子结构(顶级结构的子结构)从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重新编号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