Как изменить нумерацию значений последовательности столбцов с помощью столбца подпоследовательности - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть таблица, которая содержит столбцы StructureNumber и SubStructureNumber.StructureNumbers нумеруются последовательно, начиная с 1 для каждого PropertyId.

Дочерние структуры могут существовать для структуры, в этом случае 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

Проблема возникает, когда структура удаляется для свойства.Например, если StructureNumber 2 для PropertyId 197 удален, мне нужно изменить нумерацию структур для этого свойства, чтобы заполнить пропущенное число.

PropertyId | StructureNumber | SubStructureNumber
197        | 1               | 0
197        | 3               | 0
197        | 3               | 1
197        | 3               | 2

Аналогичным образом, если SubStructure удалена, мне нужно изменить нумерацию SubStructureNumbers.для каждого StructureNumber:

PropertyId | StructureNumber | SubStructureNumber
197        | 1               | 0
197        | 3               | 0
197        | 3               | 2

Я знаю, как выполнить перенумерацию StructureNumbers, используя CTE, как показано в в этом посте , используя что-то вроде этого:

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;

Я просто не знаю, как также изменить нумерацию SubStructureNumbers для каждого StructureNumber, не добавляя значение ROW_NUMBER () для StructureNumber для этих строк.

Я видел упоминание об использовании DENSE_RANK, но не знаю, как его использовать длявыполнить мою задачу.

1 Ответ

0 голосов
/ 25 апреля 2018

Попробуйте этот запрос. Я думаю, это то, что вы ищете

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
...