Bonjour à tous.
je cherche à 'compacter' des données que je reçois unitairement sous la forme suivante :
code (text) valeur (int) A 1 A 2 A 3 A 4 A 5 A 7 A 8 A 9 B 4 B 5 B 6 B 7 B 8
Et que je cherche à compacter sous la forme de range :
A [1,6) A [7,10) B [5,9)
Je fouille du coté des Windows Functions mais sans succès.
Une idée ?
mes tests actuels pour info :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 WITH H AS ( SELECT 'A'::text code, T.n valeur FROM generate_series(1,5) T(n) UNION SELECT 'A'::text code, T.n valeur FROM generate_series(7,9) T(n) UNION SELECT 'B'::text code, T.n valeur FROM generate_series(4,8) T(n) ) SELECT code, valeur, lag(valeur) OVER (PARTITION BY code ORDER BY valeur) AS lag, lead(valeur) OVER (PARTITION BY code ORDER BY valeur) AS lead, lead(valeur) OVER (PARTITION BY code ORDER BY valeur) - lag(valeur) OVER (PARTITION BY code ORDER BY valeur) AS diff, valeur - lag(valeur) OVER (PARTITION BY code ORDER BY valeur), lead(valeur) OVER (PARTITION BY code ORDER BY valeur) - valeur FROM H ORDER BY 1, 2
Merci à tous de votre aide
Fred.
Add-On : Avec ceci je repère les bornes basses et hautes des ranges mais comment regrouper ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 WITH H AS ( SELECT 'A'::text code, T.n valeur FROM generate_series(1,5) T(n) UNION SELECT 'A'::text code, T.n valeur FROM generate_series(7,9) T(n) UNION SELECT 'B'::text code, T.n valeur FROM generate_series(4,8) T(n) ) SELECT code, valeur, CASE WHEN (valeur - lag(valeur) OVER (PARTITION BY code ORDER BY valeur)) IS NULL THEN 0 WHEN (valeur - lag(valeur) OVER (PARTITION BY code ORDER BY valeur)) >1 THEN 0 ELSE (valeur - lag(valeur) OVER (PARTITION BY code ORDER BY valeur)) END AS A, CASE WHEN (lead(valeur) OVER (PARTITION BY code ORDER BY valeur) - valeur) IS NULL THEN 0 WHEN (lead(valeur) OVER (PARTITION BY code ORDER BY valeur) - valeur) > 1 THEN 0 ELSE (lead(valeur) OVER (PARTITION BY code ORDER BY valeur) - valeur) END AS B FROM H ORDER BY 1, 2
Partager