Vous n'êtes pas identifié(e).
Pages : 1
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
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".
Julien.
https://rjuju.github.io/
Hors ligne
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
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 ?
Julien.
https://rjuju.github.io/
Hors ligne
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
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.
Marc.
Hors ligne
Bonjour Marc,
Fantastique !
Une fois écrite, elle paraît évidente :-)
Je n'ai pas le reflexe de penser à row_number().
Merci beaucoup.
Hors ligne
Pages : 1