我有一个包含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
答案 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
现在,您可以将其用作子查询来计算两次旅行之间的天数,并根据需要过滤数据。