Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL
PostgreSQL Forum PostgreSQL. Avant de poster -> F.A.Q PostGreSQL Tutoriels PostGreSQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 26/11/2007, 11h56   #1
Membre actif
 
Avatar de budtucker
 
Développeur multimédia
Inscription : avril 2007
Messages : 175
Détails du profil
Informations professionnelles :
Activité : Développeur multimédia

Informations forums :
Inscription : avril 2007
Messages : 175
Points : 174
Points : 174
Par défaut Calcul de valeur consécutives

Bonjour,

Je recherche le moyen en Postgre de détecter les valeurs continues.

J'ai mes données du type :
Code :
1
2
3
4
5
6
7
8
9
10
Id_pers      Debut    Fin
PERS01        100        199
PERS01        200        250
PERS01        400        500
PERS02        800        859
PERS02        860        900
PERS03        200        590
PERS03        591        600
PERS03        601        650
PERS03        10000    20000
Le but est d'obtenir à la fin :
Code :
1
2
3
4
5
6
Id_pers        Debut    Fin
PERS01        100        250
PERS01        400        500
PERS02        800        900
PERS03        200        650
PERS03        10000    20000
__________________
Mohammed MEHIRA
budtucker est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2007, 15h34   #2
Membre actif
 
Avatar de budtucker
 
Développeur multimédia
Inscription : avril 2007
Messages : 175
Détails du profil
Informations professionnelles :
Activité : Développeur multimédia

Informations forums :
Inscription : avril 2007
Messages : 175
Points : 174
Points : 174
P'tit up !!

Personne ???
__________________
Mohammed MEHIRA
budtucker est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2007, 09h34   #3
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 413
Points : 6 413
Salut,

Bon, voilà une requête qui fait ce que tu souhaites à partir de l'exemple que tu as donné (j'ai nommé la table table1, original non ) :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
SELECT Id_pers, min(Debut), max(Fin)
FROM
(SELECT t1.Id_pers, t1.Debut, t2.Fin
FROM table1 t1
INNER JOIN table1 t2 ON t1.Id_pers = t2.Id_pers AND t1.Fin = t2.Debut - 1
WHERE EXISTS (SELECT 1
FROM table1 t3
WHERE t3.Id_pers = t1.Id_pers
AND t3.Debut = t1.Fin + 1)) AS T
GROUP BY Id_pers
union ALL
SELECT t1.Id_pers, Debut, Fin
FROM table1 t1
WHERE NOT EXISTS (SELECT 1
FROM table1 t3
WHERE t3.Id_pers = t1.Id_pers
AND t3.Debut = t1.Fin + 1)
AND NOT EXISTS (SELECT 1
FROM table1 t4
WHERE t4.Id_pers = t1.Id_pers
AND t4.Fin = t1.Debut - 1)
ORDER BY 1, 2, 3
Comme tu peux le voir, c'est pas évident et sûrement pas optimisé , mais ça fait ce que tu souhaites (enfin je crois ).
Il y a deux parties séparées par un union.
Dans la première partie, je regroupe pour un même Id_pers les lignes dont Debut et Fin se suivent, puis j'en sort le min des débuts et le max des fins.
Dans la seconde partie, je sélectionne les lignes qui n'ont pas de ligne consécutive en terme de début ou de fin avant ou après elles.

En espérant que ça t'aide...

ced
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2007, 11h26   #4
Membre actif
 
Avatar de budtucker
 
Développeur multimédia
Inscription : avril 2007
Messages : 175
Détails du profil
Informations professionnelles :
Activité : Développeur multimédia

Informations forums :
Inscription : avril 2007
Messages : 175
Points : 174
Points : 174
Je te remercie. Je vais voir ça !!!

A+
__________________
Mohammed MEHIRA
budtucker est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2007, 12h09   #5
Membre actif
 
Avatar de budtucker
 
Développeur multimédia
Inscription : avril 2007
Messages : 175
Détails du profil
Informations professionnelles :
Activité : Développeur multimédia

Informations forums :
Inscription : avril 2007
Messages : 175
Points : 174
Points : 174
le résultat donne la même valeur min et max pour chaque occurence.

Pas grave !! Je l'ai refais "à la dur" en php !!

Merci,

A+
__________________
Mohammed MEHIRA
budtucker est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h34.


 
 
 
 
Partenaires

Hébergement Web