Вычтите предыдущую строку данных, где идентификатор такой же, как в строке выше - PullRequest
0 голосов
/ 22 ноября 2011

Я весь день пытался добиться этого безуспешно.

У меня есть база данных с информацией о покупателях и дате, когда они покупают товары в магазине.Он сгруппирован по идентификатору партии, который я преобразовал в формат даты.

Итак, в моей таблице теперь есть:

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

Я попытался соединить таблицу с самим собой, но проблема в том, что я в конечном итогеприсоединение в том же формате.Затем я попытался с помощью моего оператора join вернуться туда, где он <> соответствовал дате.

Надеюсь, это имеет смысл, любая помощь приветствуется.Я искал все соответствующие темы здесь.

1 Ответ

2 голосов
/ 22 ноября 2011

Будет ли несколько групп 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   
...