我有一些这种格式的旧数据:
ID DT NUM
1 6-1-2012 2
1 6-2-2012 2
1 6-3-2012 4
1 6-4-2012 4
1 6-5-2012 8
1 6-6-2012 8
1 6-7-2012 8
1 6-8-2012 16
1 6-9-2012 2
1 6-10-2012 2
我需要它看起来像这样:
ID START_DT END_DT NUM
1 6-1-2012 6-2-2012 2
1 6-3-2012 6-4-2012 4
1 6-5-2012 6-7-2012 8
1 6-8-2012 6-8-2012 16
1 6-9-2012 6-10-2012 2
这是我可以快速提出的数据的最佳示例。如果我不小心在其中包含了一些误解,我很想澄清一下。
规则:
- ID:这确实发生了变化,它最终会被分组,为了让事情变得简单,在我的例子中也是一样的
- DT:我得到一个原始日期时间,在真实数据中时间部分确实不同
- START_DT、END_DT:我需要将这些列从原始 DT 中取出
- NUM:这只是一个可以更改的整数,并且可以根据 ID 重新出现
编辑:这很尴尬.....(必须有更好的答案)......我还没有在很多条件下测试过这个,但从一开始它看起来还不错......并且不得不手动找到并替换所有字段名称(友善)
select * from (
select *,row_number() over (partition by if_id, [z.num] order by if_id, [y.num]) as rownum
from (
select y.id,
y.dt as [y.dt],
z.dt as [z.dt],
y.num
from #temp as y
outer apply (select top 1 id, dt, num
from #temp as x
where x.id = y.id and
x.dt > y.dtand
x.num <> y.num
order by x.dt asc) as z ) as x ) as k
where rownum=1
order by [y.dt]