2017-10-19 2 views

Répondre

2

Utilisez le window functionslag() et sum():

with the_data(arr) as (
values (array[2,3,5,7,8,9,10,20,21,25]) 
) 

select elem, sum(diff) over w as group_nr 
from (
    select elem, (elem- 1 is distinct from lag(elem) over w)::int as diff 
    from the_data, unnest(arr) as elem 
    window w as (order by elem) 
    ) s 
window w as (order by elem); 

elem | group_nr 
------+---------- 
    2 |  1 
    3 |  1 
    5 |  2 
    7 |  3 
    8 |  3 
    9 |  3 
    10 |  3 
    20 |  4 
    21 |  4 
    25 |  5 
(10 rows) 
+0

Merci. J'avais regardé lag() et sum(), mais je n'arrivais pas à comprendre comment tout rassembler. J'ai besoin de mieux comprendre les fonctions de la fenêtre. Il sera utilisé dans le cadre d'une fonction plus grande avec le tableau en entrée, donc j'ai simplifié un peu (dans mon esprit, de toute façon) à: – Derek

+0

AVEC tmp_diff AS ( \t SELECT \t élém, (élém - 1 IS DISTINCT FROM lag (elem) OVER (ORDRE PAR elem)) :: INTEGER AS diff FROM unnest (ARRAY [2,3,5,7,8,9,10,20,21,25]) COMME ) SELECT \t elem, sum (diff) OVER (ORDER BY elem) AS groupe_nr FROM tmp_diff; – Derek

+0

Bien sûr, bien sûr, mais je préfère une table dérivée (une sous-requête dans la clause FROM) sur une instruction WITH. Dans de nombreux cas, le planificateur génère un meilleur plan pour la première variante. Voir [SqlFiddle.] (Http://sqlfiddle.com/#!17/9eecb/4933) – klin

1

Utilisez lag après désimbrication pour obtenir la différence des valeurs de ligne en cours et précédent puis utilisez la somme cumulée pour attribuer des numéros de groupe.

select id,num,sum(col) over(partition by id order by num) as grp 
from (select id,num,case when num-lag(num,1,0) over(partition by id order by num)=1 then 0 else 1 end as col 
     from (select id,unnest(array_column) as num from tbl) t 
    ) t 
+0

La logique se ressemblent à la réponse ci-dessus j'ai accepté, mais je ne peux pas voir où coems ​​"tbl" de. – Derek

+0

'tbl' est le nom de la table contenant les données. J'ai supposé que vous deviez faire ceci pour plusieurs rangées dans la table. D'où une colonne "id". –