-1

我是 SQL 新手,我的任务是执行此操作!我想找到客户使用 sql 查询重新访问我的酒店之前的天数。

这是我当前的数据表:

Passport No. Customer Name Check-in Date Check-out Date
123456       David         1/3/2011      5/3/2011
123456       David         8/3/2011      11/3/2011
654321       John          11/3/2011     18/3/2011
987654       Michael       11/3/2011     18/3/2011
654321       John          20/3/2011     24/3/2011
123456       David         7/7/2011      9/7/2011
987654       Michael       5/5/2011      8/5/2011
654321       John          20/4/2011     25/4/2011
123456       David         11/8/2011     18/8/2011
987654       Michael       1/6/2011      5/6/2011
567891       Mary          7/9/2011      3/10/2011
4

1 回答 1

1

下面是一个RANK在 CTE 中使用下一个记录抵消上一个记录的示例,以便将下一个签入日期与上一个签出日期进行比较:

WITH RankedVisits ([Rank], PassportNo, CustomerName, CheckInDate, CheckOutDate) AS
(
    SELECT 
            RANK() OVER (ORDER BY PassportNo, CheckInDate) AS [Rank],
            CustomerName,
            PassportNo,
            CheckInDate,
            CheckOutDate,
    FROM 
            Visits
)

SELECT 
        NextVisit.CustomerName, 
        DATEDIFF(D, PreviousVisit.CheckOutDate, NextVisit.CheckInDate) AS DaysBetween
FROM 
        RankedVisits AS PreviousVisit
JOIN    RankedVisits AS NextVisit
            ON PreviousVisit.[Rank] = NextVisit.[Rank] - 1  --Offset record with previous record

WHERE   NextVisit.PassportNo = PreviousVisit.PassportNo

如果您使用的是 SQL Server 2012,则有一些LEAD函数LAG可以使我上面的示例更加简洁(并且更快)。

于 2013-03-19T08:42:03.540 回答