Sql 如何合并空列以获取日期范围
表格如下:Sql 如何合并空列以获取日期范围,sql,tsql,select,Sql,Tsql,Select,表格如下: id range_start range_end --------------------------- 1 NULL 2018-01-01 1 2018-02-11 NULL 1 NULL NULL 1 NULL 2018-04-09 1 NULL NULL 2 2018-05-01 NULL 2 NULL 2018-08-01 守则: create table #test(id int,range_start da
id range_start range_end
---------------------------
1 NULL 2018-01-01
1 2018-02-11 NULL
1 NULL NULL
1 NULL 2018-04-09
1 NULL NULL
2 2018-05-01 NULL
2 NULL 2018-08-01
守则:
create table #test(id int,range_start date,range_end date)
insert #test values(1,null,'2018-01-01'),
(1,'2018-02-11',null),
(1,null,null),
(1,null,'2018-04-09'),
(1,null,null),
(2,'2018-05-01',null),
(2,null,'2018-08-01')
我希望输出可以忽略空值:
id range_start range_end
---------------------------
1 NULL 2018-01-01
1 2018-02-11 2018-04-09
2 2018-05-01 2018-08-01
第一列可以保留。
非常感谢,您可以使用
APPLY
:
select id, min(range_start) range_start, max(range_end) range_end
from (
select *, row_number()over(partition by id order by coalesce(range_start, range_end))
+ case when range_end is null then 1 else 0 end rn
from #test
where range_start is not null or range_end is not null
)a
group by id, rn
order by 1,2,3
select t.id, isnull(t.range_start, t1.range_start) as range_start, t.range_end
from #test t outer apply
( select top (1) t1.*
from #test t1
where t1.id = t.id and t1.range_start is not null and t.range_end > t1.range_start
order by t1.range_start desc
) t1
WHERE t.range_end is not null;
你所说的
第一列可以保留是什么意思?@Squirrel我认为这与没有第一个范围的初始开始日期的边缘情况有关。在这种情况下,开始日期应该报告为NULL
。如果我们不必担心可能丢失的开始日期,这个问题就会容易得多。是否有可能在尝试此查询之前删除数据?这意味着没有开始日期,因此我插入空值。