日期之间的时间。 (比Datediff更先进)

时间:2018-07-31 23:54:10

标签: sql sql-server-2012

我有一个包含Guest_ID和Trip_Date的表。我的任务是尝试为每个Guest_ID找出两次旅行之间超过365天的旅行次数。我知道在日期之间的时间可以使用datediff公式,但是我不确定如何正确插入日期。我认为,如果我可以在这部分上得到帮助,我可以做剩下的事情。

对于每次发生的这种情况,我需要报告Guest_ID,Prior_Last_Trip,New_Trip(间隔天)。该数据可以追溯到十年前,因此来宾有可能在两次访问之间有超过一年的多个时间段。

我当时正在考虑只加载一个表,这些数据以后可以查询。这样一来,当我第一次弄清楚如何进行此工作时,便可以设置存储过程或触发器来检查是否有新事件并填充表。

我不确定要开始这段代码。我以为递归可能是答案,但我不知道递归是否存在。

此表很大。约150万个唯一的Guest_ID,旅行次数超过3000万。

我正在使用SQL Server2012。如果还有其他需要帮助的内容,请告诉我。我将对其进行编辑和更新,因为我对如何自己完成这项工作有想法。


编辑1:样本数据和所需结果

Guest_ID    Trip_Date
1           1/1/2013
1           2/5/2013
1          12/5/2013
1           1/1/2015
1           6/5/2015
1           8/1/2017
1          10/2/2017
1           1/6/2018
1           6/7/2018
1           7/1/2018
1           7/5/2018
2           1/1/2018
2           2/6/2018
2           4/2/2018
2           7/3/2018
3           1/1/2014
3           6/5/2014
3           9/4/2014

Guest_ID    Prior_Last_Trip     New_Trip    DaysBetween
1            12/5/2013          1/1/2015    392
1             6/5/2015          8/1/2017    788

因此,您可以看到Guest 1在2个不同的时间没有旅行了一年,并且这两个实例都记录在结果中。来宾2的间隔从未超过一年,因此结果中没有记录。来宾3在一年内没有旅行,但目前没有往返旅行,不符合结果集的条件。如果来宾3再进行一次旅行,则会将其添加到结果集中。


编辑2:工作查询

感谢@ Code4ml,我可以正常工作了。这是完整的查询。

Select
     Guest_ID, CurrentTrip, DaysBetween,  Lasttrip

From (

Select
     Guest_ID
    ,Lag(Trip_Date,1) Over(Partition by Guest_ID Order by Trip_Date) as LastTrip    
    ,Trip_Date as CurrentTrip
    ,DATEDIFF(d,Lag(Trip_Date,1) Over(Partition by Guest_ID Order by Trip_Date),Trip_Date) as DaysBetween

From UCS

) as A

Where DaysBetween > 365

1 个答案:

答案 0 :(得分:2)

您可以尝试使用SQL LAG function来访问以前的旅行日期,如下所示。

SELECT guest_id, trip_date,
LAG (trip_date,1) OVER (PARTITION BY guest_id ORDER BY trip_date desc) AS prev_trip_date
FROM tripsTable

现在,您可以将其用作子查询来计算两次旅行之间的天数,并根据需要过滤数据。