1

我正在将源表中的记录和列的子集导入本地表。我正在尝试折叠数据,以便我可以在我的表中拥有唯一的行,但前提是日期范围是连续的。我遇到了麻烦,因为我不知道如何进行分组,这样我就不会跳过日期范围。以下是一些示例数据:


|PID | GroupID | Data | StartDate | EndDate
| 12 |       1 |    4 |        45 |      50
| 11 |       1 |    5 |        40 |      45
| 10 |       1 |    5 |        35 |      40
| 9  |       1 |    4 |        30 |      35
| 8  |       2 |    5 |        25 |      50
| 7  |       1 |    4 |        25 |      30
| 6  |       1 |    4 |        20 |      25
| 5  |       1 |    2 |        15 |      20
| 4  |       1 |    3 |        10 |      15
| 3  |       1 |    3 |         5 |      10
| 2  |       2 |    1 |         1 |      25
| 1  |       1 |    2 |         1 |       5

我试图得到这个结果:


|GroupID | HistoryID | Data | StartDate | EndDate
|      1 |         1 |    4 |        45 |      50
|      1 |         2 |    5 |        35 |      45
|      1 |         3 |    4 |        20 |      35
|      1 |         4 |    2 |        15 |      20
|      1 |         5 |    3 |         5 |      15
|      1 |         6 |    2 |         1 |       5
|      2 |         1 |    5 |        25 |      50
|      2 |         2 |    1 |         1 |      25

所以想象有数千个组 id,data列实际上是多列,开始/结束日期是实际日期。

我试图做的是某种解决方案,通过自我加入startDateendDate比较数据,或者对数据进行某种partion by groupid和分组。然后取最小值startDate和最大值endDate。但是,我想不出一种方法来使数据 4 不会从 20 startdate 到 50 enddate 并与数据 5 的日期范围重叠。

我知道在 Sql Server 2012 中有用于前瞻行和运行总计的新内容,但我正在 Sql Server 2008 中实施。有什么想法吗?

4

1 回答 1

1

如果范围之间的间隙是不可能的,或者如果它们没有破坏一个组,那么:

    ------------
-- test data
------------
declare @data table
(
    Pid int,
    GroupID int,
    Data int,
    StartDate int,
    EndDate int
)

insert into @data (Pid, GroupID, Data, StartDate, EndDate)
values 
(10, 1, 4, 45, 50),
(9, 1, 5, 40, 45),
(8, 1, 5, 35, 40),
(7, 1, 4, 30, 35),
(6, 1, 4, 25, 30),
(5, 1, 4, 20, 25),
(4, 1, 2, 15, 20),
(3, 1, 3, 10, 15),
(2, 1, 3, 5, 10),
(1, 1, 2, 1, 5)


-----------
-- solution
-----------
select
    GroupID, Data, StartDate = min(StartDate), EndDate = max(EndDate)
from
(
    select 
        *, 
        rn1 = row_number() over(order by StartDate), 
        rn2 = row_number() over(partition by GroupID, Data order by StartDate desc) 
    from @data
) t
group by GroupID, Data, rn1 + rn2
order by StartDate desc

否则,请告诉我。

于 2013-06-28T22:16:54.017 回答