Étant donné un tableau ordonné distinct d'entiers, je veux désarrimer le tableau et affecter un numéro de groupe à chaque lot d'entiers consécutifs.PostgreSQL unnest() avec des entiers consécutifs regroupés par numéro
par exemple: {} 2,3,5,7,8,9,10,20,21,25 doit retourner
elem | group_nr
-----+---------
2 | 1
3 | 1
5 | 2
7 | 3
8 | 3
9 | 3
10 | 3
20 | 4
21 | 4
25 | 5
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
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
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