Я ищу непрерывный алгоритм в tsql. Мои настройки данных, как показано ниже.
IF OBJECT_ID('Tempdb..#Area_Version') IS NOT NULL
DROP TABLE #Area_Version
CREATE TABLE #Area_Version
(
AreaVersionId INT ,
AreaId VARCHAR(1) ,
VersionId VARCHAR(2) ,
PocketGroupId INT
)
INSERT INTO #Area_Version
( AreaVersionId, AreaId, VersionId, PocketGroupId )
VALUES ( 1, 'A', 'V5', 0 ),
( 2, 'B', 'V2', 0 ),
( 3, 'C', 'V2', 0 ),
( 4, 'D', 'V3', 0 ),
( 5, 'E', 'V2', 0 ),
( 6, 'F', 'V1', 0 ),
( 7, 'F', 'V4', 0 ),
( 8, 'G', 'V3', 0 );
Полученные результаты:
AreaVersionId AreaId VersionId PocketGroupId
------------- ------ --------- -------------
1 A V5 0
2 B V2 0
3 C V2 0
4 D V3 0
5 E V2 0
6 F V1 0
7 F V4 0
8 G V3 0
(8 row(s) affected)
Ниже представлено визуальное представление данных.
AreaId V1 V2 V3 V4 V5
A x
B x
C x
D x
E x
F x x
G x
Заказывая по AreaId, я ищу смежные группы. Поскольку V2 находится в областях B, C и E, V2 и V3 в D они не могут располагаться в одном непрерывном порядке. Набор данных выше может привести к двум группам. (V5, V2, V1 и V3, V4) или (V5, V3, V4 и V2, V1). Я могу решить, какой набор имеет приоритет, на основе столбца количества, который выходит за рамки вопроса.
Основываясь на наборе результатов алгоритма, я обновлю PocketGroupId, чтобы я мог выполнять запросы на основе PocketGroupId и знать, что это непрерывная группа.
Желаемый результат должен быть примерно таким.
AreaVersionId AreaId VersionId PocketGroupId
------------- ------ --------- -------------
1 A V5 1
2 B V2 1
3 C V2 1
4 D V3 2
5 E V2 1
6 F V1 1
7 F V4 3
8 G V3 2
Любые идеи, как это может быть достигнуто. Заранее спасибо.