2016-11-07 5 views
3

ich eine Tabelle mit einer Liste der Fälle haben, und eine Liste der Status, die sie haben:SQL zählen, wie oft Status erscheinen nacheinander

Case ID | Date  | Status 
------ | ---------- |------- 
    x | 2016-11-01 | Open 
    x | 2016-11-03 | Hold 
    x | 2016-11-04 | Hold 
    x | 2016-11-05 | Open 
    x | 2016-11-08 | Hold 
    x | 2016-11-15 | Processing 
    x | 2016-11-16 | Done 

ich zeigen möchte, dass es einen neuen Rekord, aber Status für der gleiche Fall gleich geblieben:

Case ID | Date  | Status  | count 
------ | ---------- |---------- |------ 
    x | 2016-11-01 | Open  | 1 
    x | 2016-11-03 | Hold  | 1 
    x | 2016-11-04 | Hold  | 2 
    x | 2016-11-05 | Open  | 1 
    x | 2016-11-08 | Hold  | 1 
    x | 2016-11-15 | Processing | 1 
    x | 2016-11-16 | Done  | 1 

Wenn ich so etwas tun:

SELECT * 
FROM 
    (SELECT 
     ROW_NUMBER() OVER (partition by [Case ID], [status] ORDER BY Date) AS Row, 
     ID, Status, Date 
    FROM 
     Cases) AS C 
WHERE 
    ID = x 
ORDER BY 
    Date 

es nicht nehmen Beachten Sie, dass die letzte 'Hold' war nach der 'Open' und setzt Nummer 3, obwohl ich Nummer 1 brauche.

+0

können Sie bitte erwähnen, welche Art von Ausgabe, die Sie – mansi

Antwort

2

Sie müssen Inseln der aufeinander folgenden Datensätze mit der gleichen status Wert erkennen und verbrauchen die 'Island-ID' in der PARTITION BY Klausel einer ROW_NUMBER Fensterfunktion:

SELECT [Case ID], [Date], [status], 
     ROW_NUMBER() OVER (PARTITION BY [Case ID], [status], grp ORDER BY [Date]) AS [count] 
FROM (
    SELECT [Case ID], [Date], [status], 
      ROW_NUMBER() OVER (PARTITION BY [Case ID] ORDER BY [Date]) - 
      ROW_NUMBER() OVER (PARTITION BY [Case ID], [status] ORDER BY [Date]) AS grp 
    FROM Cases) AS t 
ORDER BY [Date] 
+0

wollen Danke! Genau das, was ich brauchte – Romeo

+0

Das ist wirklich ziemlich clever. – mendosi

0

Sie können unten auch versuchen ..

SELECT CASEID, 
     DATE, 
     STATUS, 
    CASE WHEN RNO<>0 THEN (rno+r) ELSE 1 END 
      FROM 
     (
SELECT CASEID, 
     DATE, 
     STATUS, 
     CASE 
     WHEN STATUS = LAG(STATUS) 
         OVER (
          PARTITION BY CASEID 
          ORDER BY CASEID,date) THEN 1 
     ELSE 0 
     END RNO, 
     ROW_NUMBER() OVER(partition by date,status ORDER BY DATE,status) R 
FROM #TABLE1)A 
+1

Danke. Ich kann die LAG-Funktion jedoch nicht verwenden, da ich den Server 2008 verwende. Aber ich kann eine von Giorgos Betsos vorgeschlagene Lösung verwenden. – Romeo

+0

@Romeo Ihre Begrüßung. Es wird besser sein, wenn Sie SQL Server 2008 markieren. – Buddi

Verwandte Themen