我相信下面现在做你所需要的。我建议分开运行所有部件,以便您可以看到他们的工作以及工作方式。
DECLARE @input AS TABLE
(Mile_Marker_Start int, Mile_Marker_End int, Value int)
INSERT INTO @input VALUES
(0,100,5), (50,150,6), (100,200,10), (75,300,9), (150,200,7)
DECLARE @staging as table
(Mile_Marker int)
INSERT INTO @staging
SELECT Mile_Marker_Start from @input
UNION -- this will remove duplicates
SELECT Mile_Marker_End from @input
; -- we need semi-colon for the following CTE
-- this CTE gets the right values, but the rows aren't "collapsed"
WITH all_markers AS
(
SELECT
groups.Mile_Marker_Start,
groups.Mile_Marker_End,
max(i3.Value) Value
FROM
(
SELECT
s1.Mile_Marker Mile_Marker_Start,
min(s2.Mile_Marker) Mile_Marker_End
FROM
@staging s1
JOIN @staging s2 ON
s1.Mile_Marker < s2.Mile_Marker
GROUP BY
s1.Mile_Marker
) as groups
JOIN @input i3 ON
i3.Mile_Marker_Start < groups.Mile_Marker_End AND
i3.Mile_Marker_End > groups.Mile_Marker_Start
GROUP BY
groups.Mile_Marker_Start,
groups.Mile_Marker_End
)
SELECT
MIN(collapse.Mile_Marker_Start) as Mile_Marker_Start,
MAX(collapse.Mile_Marker_End) as Mile_Marker_End,
collapse.Value
FROM
(-- Subquery get's IDs for the groups we're collapsing together
SELECT
am.*,
ROW_NUMBER() OVER (ORDER BY am.Mile_Marker_Start) - ROW_NUMBER() OVER (PARTITION BY am.Value ORDER BY am.Mile_Marker_Start) GroupID
FROM
all_markers am
) AS COLLAPSE
GROUP BY
collapse.GroupID,
collapse.Value
ORDER BY
MIN(collapse.Mile_Marker_Start)
我不明白这些数据。 200位于第二个数据集的第一列的位置在哪里? –
为了扩大最后一个问题......如果输出中存在200,为什么不是150? –
请为您所需的输出中的分组解释逻辑,或者如果它们不正确,请更新。正如你所看到的,我已经添加了一个答案,但它不符合你的输出。我还有另一个可能的答案,它也不同意......但其中包括所有“标记开始”和“标记结束”值。 –