Похоже, это проблема пробелов и островков, в которой вы неправильно поняли решение.
В этом случае столбец grp
сам по себе не определяет пробел или остров, онпросто дает вам дополнительную информацию, необходимую для их идентификации.
В вашем случае способ, которым вы ее реализовали (locationId, grp)
, формирует новую "подгруппу"идентификатор.
Я бы также немного изменил ваш запрос, чтобы было легче понять, что происходит ...
SELECT
*,
ROW_NUMBER() OVER (PARTITION BY GroupID, RouteID ORDER BY LengthStart)
- ROW_NUMBER() OVER (PARTITION BY GroupId, RouteId, LocationId ORDER BY LengthStart) AS grp
FROM
mytable
ORDER BY
GroupId, RouteId, LengthStart
Это делает более ясным, что разные GroupID, RouteID
имеют ничего не имеет отношения друг к другу при обработке промежутков и островков (подгруппы) .
Тогда я могу показать упрощенный пример ...
LocationID, Start, SetRowNum, LocRowNum, Difference, GroupID
1 000 1 1 0 (1,0)
1 100 2 2 0 (1,0)
2 200 3 1 2 (2,2)
2 300 4 2 2 (2,2)
1 400 5 3 2 (1,2)
2 500 6 3 3 (2,3)
3 600 7 1 6 (3,6)
2 700 8 4 4 (2,4)
2 800 9 5 4 (2,4)
Для каждого LocationID
отдельно вырабатывается island
.
A gap
- просто любая строка длялюбой другой LocationID
.
«Хитрость» заключается в том, что на каждом острове оба ряда увеличиваются вместе.При обоюдном увеличении разница остается неизменной.Эта разница составляет island_id
.
Затем, во время разрыва, первое число увеличивается, так что когда мы достигаем следующего острова, разница между двумя значениями увеличивается, давая новый island_id
** за это LocationID
.
Помните, что при разработке island_id
для location_1
мы рассматриваем все остальные местоположения как gaps
между островами местоположения 1.
Для местоположения 1 у нас есть острова в строках 1,2
и 5
, с IslandID
из 0
и 2
соответственно.
LocationID, Start, SetRowNum, LocRowNum, Difference, GROUP_ID
1 000 1 1 0 (1,0)
1 100 2 2 0 (1,0)
GAP
1 400 5 3 2 (1,2)
Для местоположения 2 у нас есть острова в строках3,4
, 6
и 8,9
с IslandID
из 2
, 3
, 4
соответственно.
LocationID, Start, SetRowNum, LocRowNum, Difference
GAP
2 200 3 1 2 (2,2)
2 300 4 2 2 (2,2)
GAP
2 500 6 3 3 (2,3)
GAP
2 700 8 4 4 (2,4)
2 800 9 5 4 (2,4)
Для Местоположения 3 у нас есть острова в ряду 7
с IslandID
из 6
.
LocationID, Start, SetRowNum, LocRowNum, Difference
GAP
3 600 7 1 6 (3,6)
GAP
В общем, все острова имеют разные идентификаторы.
Но у Location1 и Location2 есть острова с IslandID = 2.
- Итак, вам нужно использовать
(locationID, IslandID)
вместе - Составной ключ будет уникальным для этого раздела