2016-06-20 4 views
-1

Ich habe die folgende Tabelle:Wie die Zeitdifferenz zwischen den Daten zu finden, die in zwei Reihen

Customer_ID PurchaseDatetime 
309   2/3/2014 12:29:00 
309   2/27/2014 17:11:00 
309   4/15/2014 13:24:00 

Ich mag eine Abfrage schreiben, die die Differenz zwischen dem Datetime-Feld von zwei aufeinander folgenden Zeilen berechnen würden. Idealerweise sollte die Ausgabe wie folgt sein:

Customer_ID PurchaseDatetime 
309   0 
309   2/27/2014 17:11:00 - 2/3/2014 12:29:00 // The exact time difference in hours 
309   4/15/2014 13:24:00 - 2/27/2014 17:11:00 // The exact time difference in hours 

Wie schreibe ich eine solche Abfrage?

+0

Wenn Sie mit Version 2012 oder höher arbeiten, können Sie die verwenden können, LAG oder LEAD Funktionen. Wenn nicht, verwenden Sie einen Self-Join. –

Antwort

0

Diese Abfrage ...

;with cte as 
    (select row_number() over(order by (select 100)) Id.Customer_ID,PurchaseDatetime from Table) 
    select a.Customer_ID,b.PurchaseDatetime-a.PurchaseDatetime from cte a inner join cte b on a.id=b.id-1 

Dank

+0

Obwohl dieser Code die Frage beantworten kann, zusätzliche Kontext in Bezug auf _why_ und/oder _how_ es antwortet die Frage würde erheblich verbessern seine langfristige Wert. Bitte [bearbeiten] Sie Ihre Antwort, um eine Erklärung hinzuzufügen. –

-1
SELECT *, 
    PURCHASEDATETIME = 
    CASE CUSTOMER_ID 
     WHEN CUSTOMER_ID THEN 
      DATEDIFF(HH, LAG(PURCHASEDATETIME, 1) OVER(ORDER BY CUSTOMER_ID, PURCHASEDATETIME), PURCHASEDATETIME) 
     ELSE 
      NULL 
    END 
    FROM table 
2

Try this ...

CREATE TABLE #Purchases 
(
    CustomerID  INT, 
    PurchaseDate DATETIME 
) 
INSERT INTO #Purchases 
VALUES 
(100004,'2016-05-16 08:00:00'), 
(100005,'2016-05-16 09:05:00'), 
(100006,'2016-05-16 10:08:40'), 
(32141 ,'2016-05-16 11:18:00'), 
(84230 ,'2016-05-16 12:25:10'), 
(23444 ,'2016-05-16 13:40:00'), 
(100001,'2016-05-16 14:50:00') 

;WITH CTE AS 
(
    SELECT 
    CustomerID, 
    PurchaseDate, 
    ROW_NUMBER() OVER (ORDER BY PurchaseDate) AS Seq 
    FROM #Purchases 
) 
SELECT 
    p.CustomerID, 
    p.PurchaseDate, 
    pl.PurchaseDate, 
    DATEADD(SECOND,DATEDIFF(SECOND, pl.PurchaseDate,p.PurchaseDate),0) AS DiffDT, 
DATEDIFF(HOUR, pl.PurchaseDate,p.PurchaseDate) HourDiff 
FROM CTE AS p 
LEFT OUTER JOIN CTE AS pl ON pl.Seq = p.Seq - 1 -- Last batch 
ORDER BY p.PurchaseDate 
+0

Obwohl dieser Code die Frage beantworten kann, zusätzliche Kontext in Bezug auf _why_ und/oder _how_ es Antworten bietet die Frage würde erheblich verbessern seine langfristige Wert. Bitte [bearbeiten] Sie Ihre Antwort, um eine Erklärung hinzuzufügen. –

+0

Danke der Code diente meinem Zweck. Vielen Dank für Ihre Hilfe! –

+0

Willkommen, markieren Sie es als Antwort, damit andere es auch verwenden können. –

Verwandte Themen