【问题标题】:how to merge the null column to get date range如何合并空列以获取日期范围
【发布时间】:2019-12-31 04:53:22
【问题描述】:

表格是:

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

第一列可以保留。 非常感谢,

【问题讨论】:

  • The first column can be reserved 是什么意思?
  • @Squirrel 我认为这与第一个范围没有初始开始日期的边缘情况有关。在这种情况下,开始日期应报告为NULL
  • 如果我们不必担心可能缺少开始日期,这个问题会容易得多。在尝试此查询之前,您是否有机会清理您的数据?
  • 表示没有开始日期,所以我插入空值。

标签: sql tsql select


【解决方案1】:
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

【讨论】:

    【解决方案2】:

    你可以使用APPLY

    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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-02
      • 1970-01-01
      • 1970-01-01
      • 2022-01-15
      • 1970-01-01
      • 1970-01-01
      • 2018-06-27
      • 2017-02-12
      相关资源
      最近更新 更多