-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 に答える