2016-10-26 2 views
1

Ich habe eine Reihe von Daten, die Art wie geht:SQL. DateDiff zwischen den Zeilen unter durch Parsen Zeileninhalt bestimmt Bedingungen

TimeStamp | Action 
-------------+------------------------- 
'2016-01-01' | 'State changed to 1' 
'2016-01-03' | 'State changed to 2' 
'2016-01-07' | 'State changed to 1' 
'2016-01-12' | 'State changed to 2' 
'2016-01-20' | 'State changed to Final' 

Was ich zählen müssen, ist, wie viel Zeit haben, das Objekt in dem Zustand verbracht ‚1‘ , wie viel Zeit verbrachte es in Zustand '2', etc.

Ich kann nicht meinen Kopf herumspielen, wie mit DateDiff zu spielen, um Ausgabe wie (in Anbetracht wir zählend wie viele Tage jeder der Staaten zuletzt):

'1' | '2' 
--------- 
    5 | 12 

So habe ich in der Regel zwei Fragen:

  1. Ist es sogar möglich, mit SQL zu tun?
  2. Wenn es ist - wie kann das gemacht werden?

Vielen Dank im Voraus!

Edit: vergaß zu erwähnen, DBMS SQL Server 2012.

+0

Was ist Ihr DBMS? SQL Server? – Siyual

+0

Sie benötigen Pivot, um dies zu tun und den gesamten Tagesunterschied zu erhalten. –

+0

Können Sie die Logik erklären, um das Ergebnis zu erhalten. Ich konnte es nicht herausfinden? –

Antwort

1

Versuchen CASE mit und Datum Differenz erhalten wie folgt:

SELECT 
     (CASE WHEN Action = 'Action 1' THEN 
      SELECT ---- Date Diff GROUP BY Action 1 
     ELSE 0 END) 1, 
     (CASE WHEN Action = 'Action 2' THEN 
      SELECT ---- Date Diff GROUP BY Action 2 
     ELSE 0 END) 2 
END) FROM Table 
+0

Dieser hat funktioniert, danke! – IIy333o

0
SELECT MAX(CASE WHEN Action = '1' THEN TOTAL_NO_OF_DAYS END) AS '1', 
     MAX(CASE WHEN Action = '2' THEN TOTAL_NO_OF_DAYS END) AS '2' 
    FROM 
    ( 
     SELECT SUBSTR(Action, 17, 1) AS Action, 
       SUM(DATEDIFF(DAY, LEAD(Timestamp,1) OVER (ORDER BY DAY), DAY 
          ) 
        ) 
       AS TOTAL_NO_OF_DAYS 
     FROM Yourtable 
    GROUP BY Action 
) 
WHERE Action IN ('1' , '2'); 
Verwandte Themen