根据另一列的值减去行数

时间:2016-10-13 07:15:34

标签: sql sql-server sql-server-2012

我购买了两张桌子,我想减去购买日期。根据客户ID,有重复的客户ID,所以我想减去客户ID 105和105,108和108等的购买日期。

enter image description here

我有以下代码,但它会从下一个购买日期减去每个购买日期

     SELECT DATEDIFF(DAY,P1.PURCHASEDATE,P2.PURCHASEDATE) AS "diff in days since last purchase"
    FROM Purchases P1
    JOIN Purchases P2
    ON P1.CustomerID= P2.CustomerID   

2 个答案:

答案 0 :(得分:0)

尝试添加到您的ON a not equal:P1.PURCHASEID <> P2.PURCHASEID,意思是这样的:

SELECT DATEDIFF(DAY,P1.PURCHASEDATE,P2.PURCHASEDATE) AS "diff in days"
FROM Purchases P1
JOIN Purchases P2
(ON P1.CustomerID= P2.CustomerID and P1.PURCHASEID <> P2.PURCHASEID  )

答案 1 :(得分:0)

您可以使用OUTER APPLY:

;WITH Purchases AS (
SELECT *
FROM (VALUES
(1,'2012-08-15',1,105,'a510'),
(2,'2012-08-15',2,102,'a510'),
(3,'2012-08-15',3,103,'a506'),
(4,'2012-08-16',1,105,'a510'),
(5,'2012-08-17',5,106,'a507'),
(6,'2012-08-17',5,107,'a509'),
(7,'2012-08-18',4,108,'a502'),
(8,'2012-08-19',2,108,'a510'),
(9,'2012-08-19',3,109,'a502'),
(10,'2012-08-20',3,110,'a503')
) as t(PurchaseID,PurchaseDate,Qty,CustomerID,ProductID)
)

SELECT  p1.*,
        DATEDIFF(DAY,P2.PurchaseDate,P1.PurchaseDate) as ddiff
FROM Purchases p1
OUTER APPLY (
    SELECT TOP 1 *
    FROM Purchases
    WHERE p1.CustomerID = CustomerID
        AND PurchaseDate < p1.PurchaseDate
    ORDER BY PurchaseDate DESC
) p2

将输出:

PurchaseID  PurchaseDate    Qty CustomerID  ProductID   ddiff
1           2012-08-15      1   105         a510        NULL
2           2012-08-15      2   102         a510        NULL
3           2012-08-15      3   103         a506        NULL
4           2012-08-16      1   105         a510        1
5           2012-08-17      5   106         a507        NULL
6           2012-08-17      5   107         a509        NULL
7           2012-08-18      4   108         a502        NULL
8           2012-08-19      2   108         a510        1
9           2012-08-19      3   109         a502        NULL
10          2012-08-20      3   110         a503        NULL

此外,您可以使用LAG(SQL Server 2012及更高版本):

SELECT  *,
        DATEDIFF(DAY,LAG(PurchaseDate,1,NULL) OVER (PARTITION BY CustomerID ORDER BY PurchaseDate),PurchaseDate) as ddiff
FROM Purchases