Sql 根据另一列的值减去行

Sql 根据另一列的值减去行,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,我有两张桌子要买,我想减去购买日期。根据客户ID,有重复的客户ID,所以我想减去客户ID 105和105、108和108等的购买日期 我有以下代码,但它是从下一个购买日期减去每个购买日期 SELECT DATEDIFF(DAY,P1.PURCHASEDATE,P2.PURCHASEDATE) AS "diff in days since last purchase" FROM Purchases P1 JOIN Purchases P2 ON P1.Custo

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

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

     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   

请尝试在
上的
中添加一个不相等的:
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  )
选择DATEDIFF(天,P1.PURCHASEDATE,P2.PURCHASEDATE)作为“以天为单位的差异”
从购买P1
加入购买P2
(在P1.CustomerID=P2.CustomerID和P1.PURCHASEID P2.PURCHASEID上)

尝试在
上的
中添加一个不相等的:
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  )
选择DATEDIFF(天,P1.PURCHASEDATE,P2.PURCHASEDATE)作为“以天为单位的差异”
从购买P1
加入购买P2
(在P1.CustomerID=P2.CustomerID和P1.PURCHASEID P2.PURCHASEID上)

您可以使用外部应用:

;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
您还可以使用(SQL Server 2012及更高版本):


您可以使用外部应用程序:

;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
您还可以使用(SQL Server 2012及更高版本):


因此,您的结果应仅包含表中至少有两个条目的客户。对如果一个客户有多个条目,您希望看到第一次购买和最后一次购买之间的差异吗?还是在最后一个和最后一个之间?或者还有什么?所以您的结果应该只包含表中至少有两个条目的客户。对如果一个客户有多个条目,您希望看到第一次购买和最后一次购买之间的差异吗?还是在最后一个和最后一个之间?或者别的什么?