2017-10-19 3 views
0

Ich hoffe, etwas zu finden.pause row_number() folge basierend auf flag variable

Ich habe Daten wie unten

ID Monat flag 111 jan 1 111 feb 1 111 mar 1 111 April 0 111 jun 1 222 jan 1 222 feb 1 angegeben 222 mar 0 222 April jun 1

I für den Ausgang, wie unten

suchen

ID Monat flag um 111 jan 1 1 111 feb 1 2 111 mar 1 3 111 April 0 1 111 jun 1 1 222 jan 1 1 222 feb 1 2 222 mar 0 1 222 April 0 2 222 1. Juni 1

ich versuchte row_number(), aber das Problem ist, dass wir die Sequenz nicht brechen können und von vorn beginnen. Bei einer Gesamthöhe, wann immer es eine Änderung in Flagvariable von 0 auf 1 oder 1 auf 0 Ich muss von 1 für jede ID Zählen beginnen separat

Antwort

0

SQL Server Unter der Annahme, hier ein Beispiel:

DECLARE @T table (id int, [month] char(3), flag bit) 

INSERT INTO @T 
VALUES 
(111, 'jan', 1) 
,(111, 'feb', 1) 
,(111, 'mar', 1) 
,(111, 'apr', 0) 
,(111, 'may', 0) 
,(111, 'jun', 1) 
,(222, 'jan', 1) 
,(222, 'feb', 1) 
,(222, 'mar', 0) 
,(222, 'apr', 0) 
,(222, 'may', 0) 
,(222, 'jun', 1) 

SELECT 
    id 
    , [month] 
    , flag 
    , ROW_NUMBER() OVER (PARTITION BY id, section ORDER BY monthNum) [order] 
FROM 
    (
     SELECT 
      id 
      , [month] 
      , monthNum 
      , flag 
      , SUM(CASE WHEN newValue = 1 THEN 1 ELSE 0 END) OVER (PARTITION BY id ORDER BY monthNum) section 
     FROM 
      (
       SELECT 
        id 
        , [month] 
        , monthNum 
        , flag 
        , CASE WHEN LAG(flag, 1, ABS(flag - 1)) OVER (PARTITION BY id ORDER BY monthNum) = flag THEN 0 ELSE 1 END newValue 
       FROM 
        (
         SELECT 
          id 
          , [month] 
          , MONTH(CAST('1 ' + [month] + ' 17' AS datetime)) monthNum 
          , flag 
         FROM @T 
        ) Q 
      ) Q2 
    ) Q3 
+0

Mein Fehler Ich muss es in Postgresql tun –

+0

Ich kann es in Postgres tun. Vielen Dank –

Verwandte Themen