在时间范围内组合行组

时间:2018-02-06 07:37:19

标签: sql sql-server tsql

我在查询中遇到问题而且我已经停留了很长一段时间了。这种情况:我有一个包含某些记录的表,它们通过ValidFrom和ValidTo终止。此表跟踪另一个表的数据更改 - 每次基础数据更改时,终止最后一个有效记录并执行插入。遵循SQL小提琴示例:

http://sqlfiddle.com/#!18/15c7f/4/0

我尝试实现的是将在一个时间跨度内具有相同标志的记录分组到一个记录中。在我的小提琴中:我希望前两个记录与ValidFrom 2017-01-01和ValidTo 2017-01-10合并为一条记录。

无论如何,我被严重困住了,我尝试了很多方法,我在这里和另一个论坛上找到了 - 但没有成功。小提琴中包含一种方法:评估按日期排序的rownumber并减去由标志列分隔的rownumber等......但没有任何效果。

enter image description here

任何帮助都将受到高度赞赏。

2 个答案:

答案 0 :(得分:4)

尝试此查询:

select keycol, min(validfrom), max(validto), flag1, flag2 from
(
select *,
       sum(iscontinuation) over (partition by keycol order by validfrom rows between UNBOUNDED PRECEDING AND CURRENT ROW) [GroupingCol]
from (
  select *,
         case when
         lag(validto) over (partition by keycol order by validfrom) = dateadd(day, -1, validfrom) and
         lag(flag1) over (partition by keycol order by validfrom) = flag1 and
         lag(flag2) over (partition by keycol order by validfrom) = flag2 then 0
         else 1 end [IsContinuation]
   from t
) a
) b group by keycol, flag1, flag2, groupingcol

答案 1 :(得分:0)

你需要在你的小组中使用min max with partition。从Michal'Query获得一些帮助。这也可以处理多个标志数据

With CTE2 as(
select *,
       (case when flag1 = lag(flag1) over (order by (select null)) and
      flag2 = lag(flag2) over (order by (select null)) then -1 else 0 end) +
      row_number() over (order by (select null)) [GroupingCol]
from t)

Select KeyCol,Flag1,Flag2,ValidFrom,ValidTo From (
Select KeyCol,Flag1,Flag2,
     min(ValidFrom) over (partition by KeyCol,Flag1,Flag2,GroupingCol) ValidFrom ,
     Max(ValidTo) over (partition by KeyCol,Flag1,Flag2,GroupingCol) ValidTo,
     Row_number() over (partition by KeyCol,Flag1,Flag2,GroupingCol order by keycol,ValidFrom) RN
From CTE2) A where RN=1