Bonjour,
Le message d'erreur a le mérite d'être explicite : les fonctions de fenêtrages ne sont pas directement utilisables dans un UPDATE.
Néanmoins, vous devez pouvoir vous en sortir avec une CTE devant l'UPDATE et une jointure dans l'UPDATE sur cette CTE.
Exemple :
On crée une table test, contenant 2 colonnes dont la première est un entier généré aléatoirement et la seconde recevra le rang de cet entier par rapport aux autres entiers de la table (par mise à jour). On y insère 10 lignes.
1 2 3
| CREATE TEMPORARY TABLE test AS
SELECT (100 * i * RANDOM())::INT AS col1, NULL::INT AS rang
FROM generate_series(1,10) i; |
Contenu de la table test :
col1 | rang
-----------
49 |
163 |
105 |
8 |
191 |
535 |
261 |
609 |
542 |
227 |
Maintenant, la requête de mise à jour de la colonne rang à l'aide d'une fonction de fenêtrage :
1 2 3 4 5 6 7 8
| WITH t0 AS (
SELECT col1, RANK() OVER(ORDER BY col1) AS rang
FROM test
)
UPDATE test t
SET rang = t0.rang
FROM t0
WHERE t.col1 = t0.col1; |
Et le résultat obtenu :
col1 | rang
-----------
8 | 1
49 | 2
105 | 3
163 | 4
191 | 5
227 | 6
261 | 7
535 | 8
542 | 9
609 | 10
À vous d'adapter cet exemple à votre cas de figure.
@+
Partager