0

私は午後中ずっと、これを達成しようと試みてきましたが、成功しませんでした。

私は、顧客に関する情報と、顧客が店舗から製品を購入した日付を含むデータベースを持っています。日付形式に変換したバッチ ID でグループ化されています。

したがって、私のテーブルには次のものがあります。

CustomerID|Date
1234      |2011-10-18
1234      |2011-10-22
1235      |2011-11-16
1235      |2011-11-17

私が達成したいのは、最新の購入から最後の購入までの日数などを確認することです。

例えば:

CustomerID|Date       |Outcome
1234      |2011-10-18 |
1234      |2011-10-22 | 4
1235      |2011-11-16 |
1235      |2011-11-17 | 1

テーブルをそれ自体に結合しようとしましたが、同じ形式で結合してしまうという問題があります。次に、結合ステートメントを使用して、<> の一致日付を返すようにしました。

これが理にかなっていることを願っています。ここで関連するすべてのトピックを検索しました。

4

1 に答える 1

2

CustomerID の複数のグループはありますか? それとも常に一緒にグループ化されていますか?

DECLARE @myTable TABLE
(
    CustomerID INT,
    Date DATETIME
)

INSERT INTO @myTable
SELECT 1234, '2011-10-14' UNION ALL
SELECT 1234, '2011-10-18' UNION ALL
SELECT 1234, '2011-10-22' UNION ALL
SELECT 1234, '2011-10-26' UNION ALL
SELECT 1235, '2011-11-16' UNION ALL
SELECT 1235, '2011-11-17' UNION ALL 
SELECT 1235, '2011-11-18' UNION ALL
SELECT 1235, '2011-11-19'

SELECT  CustomerID, 
        MIN(date), 
        MAX(date), 
        DATEDIFF(day,MIN(date),MAX(date)) Outcome
FROM @myTable 
GROUP BY CustomerID

SELECT  a.CustomerID, 
        a.[Date], 
        ISNULL(DATEDIFF(DAY, b.[Date], a.[Date]),0) Outcome
FROM 
(
    SELECT  ROW_NUMBER() OVER(PARTITION BY [CustomerID] ORDER BY date) Row,
            CustomerID,
            Date
    FROM @myTable 
) A
LEFT JOIN 
(
    SELECT  ROW_NUMBER() OVER(PARTITION BY [CustomerID] ORDER BY date) Row,
            CustomerID,
            Date
    FROM @myTable 
) B ON a.CustomerID = b.CustomerID AND A.Row = B.Row + 1   
于 2011-11-22T19:17:55.760 に答える