2017-10-13 18 views
0

Quelqu'un pourrait me donner un coup de main sur la façon d'ajouter une colonne de groupe en utilisant SQL de base? Je travaille avec Teradata SQL Assistant.Groupes de classement utilisant le SQL de base

Mon jeu de données est le suivant:

mydate  color  mytime 
---------------------------- 
9/1/2017 red  1:00 
9/1/2017 red  2:00 
9/1/2017 red  3:00 
9/1/2017 red  4:00 
9/1/2017 yellow  5:00 
9/1/2017 yellow  6:00 
9/1/2017 red  7:00 
9/1/2017 red  8:00 
9/1/2017 yellow  9:00 
9/1/2017 yellow 10:00 
9/1/2017 yellow 11:00 
9/1/2017 yellow 12:00 
9/1/2017 red  13:00 
9/1/2017 red  14:00 
9/1/2017 red  15:00 
9/1/2017 yellow 16:00 
9/1/2017 yellow 17:00 

Mon résultat souhaité (en ajoutant la colonne "mygroup"):

mydate  color mygroup mytime 
---------------------------------- 
9/1/2017 red  1  1:00 
9/1/2017 red  1  2:00 
9/1/2017 red  1  3:00 
9/1/2017 red  1  4:00 
9/1/2017 yellow 2  5:00 
9/1/2017 yellow 2  6:00 
9/1/2017 red  3  7:00 
9/1/2017 red  3  8:00 
9/1/2017 yellow 4  9:00 
9/1/2017 yellow 4  10:00 
9/1/2017 yellow 4  11:00 
9/1/2017 yellow 4  12:00 
9/1/2017 red  5  13:00 
9/1/2017 red  5  14:00 
9/1/2017 red  5  15:00 
9/1/2017 yellow 6  16:00 
9/1/2017 yellow 6  17:00 
+1

D'où vient la valeur dans la colonne 'mygroup'? Besoin d'un peu plus d'informations parce que je ne comprends pas quels critères vous regroupez par. – tommyO

+0

Le groupe est basé sur la couleur mais vient dans un ordre de temps. – moony

Répondre

1
select 
    mydate 
    ,color 
    ,mytime 
    -- then create the group number 
    ,sum(flag) 
    over (order by mydate, mytime 
     rows unbounded preceding) as mygroup 
from 
( 
    select 
     mydate 
     ,color 
     ,mytime 
     -- first: find the row where the color changes 
     -- previous row is different from current row 
     ,case when min(color) 
       over (order by mydate, mytime 
         rows between 1 preceding and 1 preceding) = color 
      then 0 
      else 1 
     end as flag 
    from mytable 
) as dt 

Le calcul MIN(color) est une émulation la fonction LAG qui n'était pas disponible dans Teradata avant TD16.10.

+0

Wow! Merci beaucoup dnoeth! C'est exactement ce dont j'ai besoin! Merci beaucoup! – moony