另一個不使用遞歸的選項。它使用內存中的表來編號(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是的,我有一個巨大的數據 –