SQL如何基于数据列将具有日期范围的行转换为具有日期范围的许多行

问题描述

我想基于列将数据行转换为sql中的日期范围。 下面是示例数据:

Current Data

FROMDATE    TODATE      Data
1/01/2010   31/10/2010  100
1/01/2011   31/12/2011  50
1/01/2012   31/12/2012  50
1/01/2013   31/12/2013  50
1/01/2014   31/12/2014  50
1/01/2015   12/10/2015  50
13/10/2015  31/12/2015  50
1/01/2016   21/02/2016  50
22/02/2016  31/12/2016  67
1/01/2017   2/10/2017   67
3/10/2017   31/12/2017  75
1/01/2018   31/03/2018  75
1/04/2018   30/06/2018  75
1/07/2018   31/10/2018  40
1/11/2018   31/12/2018  75
1/01/2019   31/03/2019  75
1/04/2019   31/12/2019  75
1/01/2020   1/03/2020   75

所需结果为:

FROMDATE    TODATE      Data
1/01/2010   31/10/2010  100
1/01/2011   21/02/2016  50
22/02/2016  2/10/2017   67
3/10/2017   30/06/2018  75
1/07/2018   31/10/2018  40
1/11/2018   1/03/2020   75

Required List

解决方法

我想感谢@Gordon Linoff,他是answer之一帮助我解决了与大家分享的空白和岛屿问题。

之所以将其发布为答案是因为标题可能会在此类问题的搜索结果中找到

我已经使用Oracle数据库完成了它,它应该与所有标准sql数据库一起使用。 dbfiddle供参考

SELECT t.key_id,MIN(fromdate),MAX(todate)
FROM   (SELECT t.*,row_number() over(ORDER BY fromdate) AS startseq,row_number() over(PARTITION BY t.key_id ORDER BY fromdate) AS endseq
        FROM   some_table t) t
GROUP  BY t.key_id,(startseq - endseq);

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...