Une autre façon de faire référence à la ligne précédente dans une requête SQL est d'utiliser une balise expression récursive de la table commune (CTE) :
CREATE TABLE t (counter INTEGER);
INSERT INTO t VALUES (1),(2),(3),(4),(5);
WITH cte(counter, previous, difference) AS (
-- Anchor query
SELECT MIN(counter), 0, MIN(counter)
FROM t
UNION ALL
-- Recursive query
SELECT t.counter, cte.counter, t.counter - cte.counter
FROM t JOIN cte ON cte.counter = t.counter - 1
)
SELECT counter, previous, difference
FROM cte
ORDER BY counter;
Résultat :
compteur
précédent
différence
1
0
1
2
1
1
3
2
1
4
3
1
5
4
1
La requête d'ancrage génère la première ligne de l'expression de la table commune cte
où il fixe cte.counter
à la colonne t.counter
dans la première ligne du tableau t
, cte.previous
à 0, et cte.difference
à la première ligne de t.counter
.
La requête récursive joint chaque ligne de l'expression du tableau commun cte
à la ligne précédente du tableau t
. Dans la requête récursive, cte.counter
se réfère à t.counter
dans chaque ligne du tableau t
, cte.previous
se réfère à cte.counter
dans la ligne précédente de cte
y t.counter - cte.counter
fait référence à la différence entre ces deux colonnes.
Notez qu'un ETC récursif est plus souple que les fonctions LAG et LEAD, car une ligne peut faire référence à n'importe quel résultat arbitraire d'une ligne précédente. (A fonction ou processus récursif est un processus dont l'entrée est la sortie de l'itération précédente de ce processus, à l'exception de la première entrée qui est une constante).
J'ai testé cette requête à SQLite en ligne .