另一个不使用递归的选项。它使用内存中的表来编号(Num字段)不同的段。然后它为每个细分市场的所有成员编号。最后,它按名称在每个分段上分组,并且Num提供FromPoint的最小值和ToPoint的最大值。
只有组内没有重叠分段时,这才起作用。
DECLARE @tbl TABLE(Num INT, Name VARCHAR(50), FromPoint INT, ToPoint INT)
INSERT INTO @tbl
SELECT ROW_NUMBER() OVER (ORDER BY T.Name, T.FromPoint)Num
, T.Name, T.FromPoint, T.ToPoint
FROM TestTable T
WHERE NOT EXISTS(SELECT T.Name FROM TestTable T1
WHERE T.Name=T1.Name AND T.FromPoint=T1.ToPoint)
UNION
SELECT 0 Num, T2.Name, T2.FromPoint, T2.ToPoint
FROM TestTable T2
WHERE EXISTS(SELECT T3.Name FROM TestTable T3
WHERE T2.Name=T3.Name AND T2.FromPoint=T3.ToPoint)
SELECT MyTable.Name, MIN(MyTable.FromPoint)FromPoint, MAX(MyTable.ToPoint)ToPoint
FROM
(SELECT CASE WHEN T.Num=0 THEN
(SELECT TOP 1 TMP.Num FROM @tbl TMP WHERE TMP.Name=T.Name
AND T.FromPoint>TMP.FromPoint AND TMP.Num>0
ORDER BY T.FromPoint-TMP.FromPoint
)
ELSE T.Num END Num
,T.Name, T.FromPoint, T.ToPoint FROM
@tbl T)MyTable
GROUP BY MyTable.Name, MyTable.Num
第2行和第3行发生了什么?如果A 0 9 B 2 6 ?? –
是否有每个名称的最大数量从/到?如在0-2-4-9中可以进一步扩展到例如0-2-4-9-11-13-22 –
Brett Schneider是的,我有一个巨大的数据 –