J'ai la séquence de nombres ci-dessous et je veux créer un nouveau groupe de nombres chaque fois que le nombre suivant présente une différence de plus d'une unité par rapport à la valeur précédente, c'est-à-dire en rompant l'intervalle continu
Tableau T
value
1
2
3
5
6
7
15
16
17
18
Groupes à former d'intervalle continu :
min max
1 3
5 7
15 18
J'essaie de numéroter les lignes en utilisant la fonction dense_rank(), comme dans l'exemple ci-dessous, puis je pourrai regrouper par rankNumber et obtenir les valeurs MIN(value) et MAX(value), mais je ne trouve pas de modèle à utiliser dans la clause PARTITION BY de cette fonction.
value rankNumber
1 1
2 1
3 1
5 2
6 2
7 2
15 3
16 3
17 3
18 3
WITH T2 AS
(
SELECT value, LEAD(value) OVER(ORDER BY value) as nextValue
FROM T
)
SELECT value, DENSE_RANK()
OVER(PARTITION BY CASE WHEN nextValue - value > 1 THEN 1 ELSE 0 END ORDER BY value)
FROM T2
Code pour créer la table :
CREATE TABLE t(
value INT
);
INSERT INTO t VALUES
(1), (2), (3), (5), (6), (7), (15), (16), (17), (18);
Sortie actuelle en utilisant la requête ci-dessus :
value rankNumber
1 1
2 2
3 1
5 3
6 4
7 2
15 5
16 6
17 7
18 8