Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何合并空列以获取日期范围_Sql_Tsql_Select - Fatal编程技术网

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
。如果我们不必担心可能丢失的开始日期,这个问题就会容易得多。是否有可能在尝试此查询之前删除数据?这意味着没有开始日期,因此我插入空值。