首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据记录之间经过的时间(即行)重新计算开始日期和结束日期。

根据记录之间经过的时间(即行)重新计算开始日期和结束日期。
EN

Stack Overflow用户
提问于 2022-01-26 21:03:39
回答 1查看 62关注 0票数 0

我很困惑。我在Server数据库中有时间序列数据。每一行代表顾客在酒店住宿的时间。然而,有时客户会延长住宿,换房等,这些都会作为单独的预订记录在系统中。为了我们的目的,我需要考虑那些连续的“预订”作为一个持续的停留。考虑数据:

代码语言:javascript
复制
| CUSTOMERID | STARTDATE  | ENDDATE  |
| --------   | -----------| -------- |
| 1          |2021-07-02  |2021-07-14|
| 1          |2021-07-19  |2021-07-27|
| 2          |2018-11-12  |2018-11-16|
| 2          |2018-11-17  |2018-11-19|
| 2          |2018-11-19  |2018-11-25|
| 2          |2019-01-10  |2019-01-15|

我需要做的是汇总任何两个记录,其中客户下一次访问的STARTDATE是<=1日,与当前记录的ENDDATE不同。换句话说,访问之间必须有一个完整的日历日,才能将它们区分开来。我需要最后一张桌子看起来像这样:

代码语言:javascript
复制
| CUSTOMERID | STARTDATE  | ENDDATE  |NEWSTARTDATE|NEWENDDATE|
| --------   | -----------| -------- |------------|----------|
| 1          |2021-07-02  |2021-07-14|2021-07-02  |2021-07-14|
| 1          |2021-07-19  |2021-07-27|2021-07-19  |2021-07-27|
| 2          |2018-11-12  |2018-11-16|2018-11-12  |2018-11-25|
| 2          |2018-11-17  |2018-11-19|2018-11-12  |2018-11-25|
| 2          |2018-11-19  |2018-11-25|2018-11-12  |2018-11-25|
| 2          |2019-01-10  |2019-01-15|2019-01-10  |2019-01-15| 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-28 21:02:43

感谢答案的@lptr,它在子查询的case语句中包含了一个窗口函数。见下面的链接:

https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=f2c905f2c31675c179d9f2100d74f44f

代码语言:javascript
复制
create table t(CUSTOMERID int, STARTDATE date, ENDDATE date);
insert into t(CUSTOMERID , STARTDATE , ENDDATE )
values
(1, '2021-07-02', '2021-07-14'),
(1, '2021-07-19', '2021-07-27'),
(2, '2018-11-12', '2018-11-16'),
(2, '2018-11-17', '2018-11-19'),
(2, '2018-11-19', '2018-11-25'),
(2, '2019-01-10', '2019-01-15');


select CUSTOMERID , STARTDATE , ENDDATE,
 max(sdate) over(partition by CUSTOMERID order by STARTDATE ) as NewStartDate,
 min(edate) over(partition by CUSTOMERID order by STARTDATE rows between current row and unbounded following) as NewEndDate
from
(
select *, 
 case when STARTDATE <= lag(dateadd(day, 1, ENDDATE)) over(partition by CUSTOMERID order by STARTDATE ) then null 
      else STARTDATE 
 end as sdate,
 case when ENDDATE>= lead(dateadd(day, -1, STARTDATE )) over(partition by CUSTOMERID order by STARTDATE ) then null 
      else ENDDATE
 end as edate
from t
) as t
order by STARTDATE ;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70870220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档