2

我有一张大约超过一百万条记录的表。下面给出了几个示例值:

Group    MemberNo
ABC           100
ABC           101
ABC           200
ABC           201
ABC           202
ABC           203
XYZ           100
XYZ           101
ABC           204
XYZ           301
XYZ           302
ABC           500
ABC           600

我希望将具有相同组的连续值范围分组为这样的集合:

Group  FromMemberNo      ToMemberNo
ABC             100             101
ABC             200             204
XYZ             100             101
XYZ             301             302
ABC             500             500
ABC             600             600

请从上表中看到,由于 100 和 101 是连续的,因此它已被分组为一条记录 ABC 100 到 101。我已经尝试过这个线程并且对我来说工作正常。但这比预期花费了相当长的时间。
请帮助我实现这一目标。

提前致谢。

4

1 回答 1

2

另一种解决方案。我可以了解性能,但似乎可以完成工作(仅限 sql 2012)

declare @t table (g varchar(3), mn int)

insert into @t values 
('ABC',           100),
('ABC',           101),
('ABC',           200),
('ABC',           201),
('ABC',           202),
('ABC',           203),
('XYZ',           100),
('XYZ',           101),
('ABC',           204),
('XYZ',           301),
('XYZ',           302),
('ABC',           500),
('ABC',           600),
('XYZ',           400);


with ctet as (
    select 
        row_number() over (order by g, mn) rn,
        *, 
        case when lag(mn, 1) over (order by g, mn) <> mn - 1 then 1 else 0 end as d 
    from 
        @t
)

select g, min(mn), max(mn)
from
    (
    select 
        *,
        (select sum(d) from ctet vv where vv.rn <= ctet.rn) s
    from 
        ctet
    ) v
group by g, s

我很确定有滞后或领先的更智能的解决方案,但我找不到。

===== 编辑 =====

finally 也适用于 2005 年

 with ctet as (
    select 
        row_number() over (order by t.g, t.mn) rn,
        t.*, 
        case when tt.g is null then 1 else 0 end as d
    from 
        @t t
        left join @t tt on t.g = tt.g and t.mn = tt.mn + 1
)
于 2013-01-22T14:43:13.480 回答