2017-10-19 9 views
0

Espérant trouver quelque chose.break row_number() séquence basée sur la variable de drapeau

I contiennent des données comme indiqué ci-dessous

id mois drapeau 111 1 janvier 111 1 février 111 1 mars 111 avril 0 111 peut 0 111 1 juin 222 1 janvier 222 1 février 222 mar 0 0 222 avril 222 peut 0 222 juin 1

I à la recherche de la sortie comme ci-dessous

id mois drapeau ordre 111 1 janvier 1 111 1 février 2 111 mar 1 3 111 avril 0 1 111 peut 0 2 111 1 juin 1 222 1 janvier 1 222 1 février 2 222 mar 0 1 avril 222 peut 0 3 222 1 juin 1

J'ai essayé row_number() mais le problème est que nous ne pouvons pas briser la séquence et recommencer. Au niveau global, chaque fois que il y a un changement dans la variable de drapeau de 0 à 1 ou 1 à 0, je dois commencer à compter de 1 pour chaque identifiant séparément

Répondre

0

En supposant SQL Server, voici un exemple:

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

Mon erreur Je dois le faire en postgresql –

+0

Je suis capable de le faire en postgres. Je vous remercie –