PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 17/01/2017 11:28:15

mortimer.pw
Membre

Première occurrence de couple

Bonjour,

Je travaille sur un moteur 9.3 sous Cent-OS.

J'ai la table suivante :

id_perso        id_operation    id_document    jour                debut        fin            temps        quantite
00201        0001            72456649        2016-12-19        080000        081500        0.250000        27
00201        0001            72456649        2016-12-19        081500        083000        0.250000        0
00201        0001            72456649        2016-12-19        083000        084500        0.250000        0
00212        0001            72308647        2016-12-19        091418        091727        0.052500        27
00217        0003            72308647        2016-12-19        105714        105758        0.012222        27
00212        0001            72308647        2016-12-19        110935        110948        0.003611        0
00209        0050            72308647        2016-12-22        145144        145515        0.058611        27
00217        0051            72308647        2016-12-22        170642        170720        0.010556        27
00217        0002            04648240        2017-01-10        094342        094602        0.038889        32
00206        0010            04648240        2017-01-10        152749        153236        0.079722        32
00206        0011            04648240        2017-01-10        153236        153421        0.029167        32
00206        0011            04648240        2017-01-10        153755        154248        0.081389        0
00211        0010            04648240        2017-01-11        073208        073302        0.015000        32
00210        0036            04648240        2017-01-11        115652        120935        0.211944        154

Je voudrais trouver, pour chaque couple id_document+id_operation, la première occurrence, seulement s'il y a plusieurs occurrences et qu'un autre couple vient s'intercaler entre elles.

En résultat, je devrais avoir :

id_perso        id_operation    id_document    jour                debut        fin            temps        quantite
00212        0001            72308647        2016-12-19        091418        091727        0.052500        27
00206        0010            04648240        2017-01-10        152749        153236        0.079722        32

Est-ce possible SANS passer par PL/pgSQL ? peut-être avec une fonction de fenêtrage (que j'ai du mal à maîtriser).

Pouvez-vous m'aiguiller, svp ?

D'avance merci pour votre aide.

Hors ligne

#2 17/01/2017 13:36:30

rjuju
Administrateur

Re : Première occurrence de couple

Je ne suis pas sur d'avoir compris votre besoin.  Qu'entendez-vous par "un autre couple vient s'intercaler entre elles".  Plus précisément quelle est votre définition de "entre".

Hors ligne

#3 17/01/2017 14:19:03

mortimer.pw
Membre

Re : Première occurrence de couple

Bonjour Julien,

Par exemple, celui-ci : le couple 72308647+0003, s'intercale entre deux occurrences du couple 72308647+0001.
00212        0001            72308647        2016-12-19        091418        091727        0.052500        27
00217        0003            72308647        2016-12-19        105714        105758        0.012222        27
00212        0001            72308647        2016-12-19        110935        110948        0.003611        0

Ou encore, celui-là : le couple 04648240+0011, s'intercale deux fois, entre deux occurrences du couple 04648240+0010.
00206        0010            04648240        2017-01-10        152749        153236        0.079722        32
00206        0011            04648240        2017-01-10        153236        153421        0.029167        32
00206        0011            04648240        2017-01-10        153755        154248        0.081389        0
00211        0010            04648240        2017-01-11        073208        073302        0.015000        32

J'espère que c'est plus clair. Pas toujours facile d'énoncer un problème, désolé.

Hors ligne

#4 17/01/2017 19:00:54

rjuju
Administrateur

Re : Première occurrence de couple

Ce n'est pas plus clair.  Pour avoir une position, il faut avoir un tri.  En fonction du tri de quelle(s) colonne(s) considérez-vous le chevauchement ?

Hors ligne

#5 18/01/2017 08:23:15

mortimer.pw
Membre

Re : Première occurrence de couple

Bonjour Julien,
Ah mince ! :-(
Les enregistrements doivent être triés par Id_document, Jour, Début, Fin.
Je parcours et je tombe sur le 1er couple Id_document+Id_operation.
Si j'ai une autre occurrence de ce couple, ce couple m'intéresse.
Mais en plus il faut qu'un autre couple s'intercale (deux couples identiques qui se suivent ne m'intéresse pas).
J'espère que c'est mieux.
Merci de prendre le temps de m'aider.

Hors ligne

#6 18/01/2017 11:48:28

Marc Cousin
Membre

Re : Première occurrence de couple

Ok, donc on doit pouvoir l'écrire comme ça:

select * from (

        select *,
               lead(globalrownum) over (partition by id_document,id_operation order by Id_document, Jour, Debut, Fin) as next_in_partition 
        from (select *,row_number() over (order by Id_document, Jour, Debut, Fin) as globalrownum from document) 
        as sorted_docs)
as filtered_docs
where next_in_partition <> globalrownum+1

Mais ça devient assez peu naturel en SQL.

Hors ligne

#7 18/01/2017 12:40:21

mortimer.pw
Membre

Re : Première occurrence de couple

Bonjour Marc,

Fantastique !
Une fois écrite, elle paraît évidente :-)

Je n'ai pas le reflexe de penser à row_number().

Merci beaucoup.

Hors ligne

Pied de page des forums