Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Comment éliminer les doublons dans le résultat d'une requête

8 réponses
Avatar
Denis P
Bonjour tout le monde,

Supposons une table Activite lié à une table Service. La table Activité
enregistre chaque activité pour un service.

Table Activité

act_id
act_serv_id
act_heure

Je veux récupérer de la table activité la dernière activité pour chaque
service ainsi que l'heure de l'activité. Disons que le contenu de la table
ressemble à ceci

act_id act_serv_id act_heure
1 1 10:00
2 1 13:00
3 2 11:30
4 1 16:15
5 2 15:45

Je voudrais donc que le résultat de ma requête me donne

act_id act_serv_id act_heure
4 1 16:15
5 2 15:45

Si je fais une requête pour récupérer seulement la dernière activité pour
chaque service sans tenir compte de l'heure pas de problème je fais

SELECT act_serv_id, MAX(act_id)
FROM Activite
GROUP BY act_serv_id

Par contre si je fais la même chose en ajoutant l'heure, alors là j'obtiens
tous les enregistrements puisque l'heure est différente pour chacun.

SELECT act_serv_id, act_heure, MAX(act_id)
FROM Activite
GROUP BY act_serv_id, act_heure

Puisque je suis obligé de mettre et le service et l'heure dans la clause
GROUP BY, forcément je reçois tous les enregistrements.

Donc il doit bien avoir une façon de regrouper mes enregistrements pour
obtenir seulement la dernière activité pour chaque service en ayant l'heure
de cette activité d'inclus dans le résultat de ma requête.

Merci pour vos toujours précieuses suggestions.

Denis P

8 réponses

Avatar
Raymond [mvp]
Bonsoir.

tu prends la valeur max pour les heures également.

--
@+
Raymond Access MVP
http://access.seneque.free.fr/
http://access2003.free.fr/
http://users.skynet.be/mpfa/ pour une meilleure
efficacité de tes interventions sur MPFA


"Denis P" a écrit dans le message de
news:%
Bonjour tout le monde,

Supposons une table Activite lié à une table Service. La table Activité
enregistre chaque activité pour un service.

Table Activité

act_id
act_serv_id
act_heure

Je veux récupérer de la table activité la dernière activité pour chaque
service ainsi que l'heure de l'activité. Disons que le contenu de la table
ressemble à ceci

act_id act_serv_id act_heure
1 1 10:00
2 1 13:00
3 2 11:30
4 1 16:15
5 2 15:45

Je voudrais donc que le résultat de ma requête me donne

act_id act_serv_id act_heure
4 1 16:15
5 2 15:45

Si je fais une requête pour récupérer seulement la dernière activité pour
chaque service sans tenir compte de l'heure pas de problème je fais

SELECT act_serv_id, MAX(act_id)
FROM Activite
GROUP BY act_serv_id

Par contre si je fais la même chose en ajoutant l'heure, alors là
j'obtiens

tous les enregistrements puisque l'heure est différente pour chacun.

SELECT act_serv_id, act_heure, MAX(act_id)
FROM Activite
GROUP BY act_serv_id, act_heure

Puisque je suis obligé de mettre et le service et l'heure dans la clause
GROUP BY, forcément je reçois tous les enregistrements.

Donc il doit bien avoir une façon de regrouper mes enregistrements pour
obtenir seulement la dernière activité pour chaque service en ayant
l'heure

de cette activité d'inclus dans le résultat de ma requête.

Merci pour vos toujours précieuses suggestions.

Denis P




Avatar
Denis P
Désolé j'avais trop simplifié ma demande, c'est un peu plus compliqué que
cela en fait. Dans la réalité dans la table Activite j'ai plusieurs autre
champs que je récupère, comme par exemple la date, le nom de l'employé et
une description de l'activité. Donc malgré tous les autres champs que je
souhaite obtenir dans le résultat de ma requête, comment dois-je faire pour
avoir un regroupement sur la dernière activité basé uniquement sur mon champ
act_serv_id.

Excusez-moi de ne pas avoir été assez précis

Denis P
"Raymond [mvp]" a écrit dans le message de
news:
Bonsoir.

tu prends la valeur max pour les heures également.

--
@+
Raymond Access MVP
http://access.seneque.free.fr/
http://access2003.free.fr/
http://users.skynet.be/mpfa/ pour une meilleure
efficacité de tes interventions sur MPFA


"Denis P" a écrit dans le message de
news:%
Bonjour tout le monde,

Supposons une table Activite lié à une table Service. La table Activité
enregistre chaque activité pour un service.

Table Activité

act_id
act_serv_id
act_heure

Je veux récupérer de la table activité la dernière activité pour chaque
service ainsi que l'heure de l'activité. Disons que le contenu de la
table


ressemble à ceci

act_id act_serv_id act_heure
1 1 10:00
2 1 13:00
3 2 11:30
4 1 16:15
5 2 15:45

Je voudrais donc que le résultat de ma requête me donne

act_id act_serv_id act_heure
4 1 16:15
5 2 15:45

Si je fais une requête pour récupérer seulement la dernière activité
pour


chaque service sans tenir compte de l'heure pas de problème je fais

SELECT act_serv_id, MAX(act_id)
FROM Activite
GROUP BY act_serv_id

Par contre si je fais la même chose en ajoutant l'heure, alors là
j'obtiens

tous les enregistrements puisque l'heure est différente pour chacun.

SELECT act_serv_id, act_heure, MAX(act_id)
FROM Activite
GROUP BY act_serv_id, act_heure

Puisque je suis obligé de mettre et le service et l'heure dans la clause
GROUP BY, forcément je reçois tous les enregistrements.

Donc il doit bien avoir une façon de regrouper mes enregistrements pour
obtenir seulement la dernière activité pour chaque service en ayant
l'heure

de cette activité d'inclus dans le résultat de ma requête.

Merci pour vos toujours précieuses suggestions.

Denis P








Avatar
Raymond [mvp]
Je viens de relire plusieurs fois ton post, le act_id est bien un numauto ?
si tu tries acsendant sur ce champ, en groupant sur act_serv_id ,
l'enregistrement à garder est bien le dernier ? donc si on met l'opération
dernier sur tous les champs on doit récupérer les dernières valeurs
enregustrées. si le numauto n'est pas bon, un tri sur la date devrait aller.

--
@+
Raymond Access MVP
http://access.seneque.free.fr/
http://access2003.free.fr/
http://users.skynet.be/mpfa/ pour une meilleure
efficacité de tes interventions sur MPFA


"Denis P" a écrit dans le message de
news:
Désolé j'avais trop simplifié ma demande, c'est un peu plus compliqué que
cela en fait. Dans la réalité dans la table Activite j'ai plusieurs
autre

champs que je récupère, comme par exemple la date, le nom de l'employé et
une description de l'activité. Donc malgré tous les autres champs que je
souhaite obtenir dans le résultat de ma requête, comment dois-je faire
pour

avoir un regroupement sur la dernière activité basé uniquement sur mon
champ

act_serv_id.

Excusez-moi de ne pas avoir été assez précis


Avatar
Denis P
Bonjour Raymond, effectivement act_id est un numéro auto, le problème c'est
justement que Access refuse que je groupe seulement sur act_serv_id. Ça
serait tellement simple si on pouvait le faire. Donc je dois inclure dans
le Group By tous les champs que j'ai placé dans le SELECT sinon j'obtiens
une erreur. Je me demande bien pourquoi les SGBD ne permettent pas de
grouper seulement sur un champ dans la clause GROUP BY.

Finalement, la seule solution que j'ai trouvé c'est d'inclure une
sous-requête dans ma requête. Ce qui donne ceci

SELECT act_serv_id, act_heure, act_description, MAX(act_id)
FROM Activite
WHERE act_id IN ( SELECT MAX(act_id) FROM Activite GROUP BY act_serv_id)

De cette façon j'obtiens seulement les enregistrements que je désire.

Merci de t'être penché sur mon problème.

@ +

Denis P
"Raymond [mvp]" a écrit dans le message de
news:ujB%
Je viens de relire plusieurs fois ton post, le act_id est bien un numauto
?

si tu tries acsendant sur ce champ, en groupant sur act_serv_id ,
l'enregistrement à garder est bien le dernier ? donc si on met l'opération
dernier sur tous les champs on doit récupérer les dernières valeurs
enregustrées. si le numauto n'est pas bon, un tri sur la date devrait
aller.


--
@+
Raymond Access MVP
http://access.seneque.free.fr/
http://access2003.free.fr/
http://users.skynet.be/mpfa/ pour une meilleure
efficacité de tes interventions sur MPFA


"Denis P" a écrit dans le message de
news:
Désolé j'avais trop simplifié ma demande, c'est un peu plus compliqué
que


cela en fait. Dans la réalité dans la table Activite j'ai plusieurs
autre

champs que je récupère, comme par exemple la date, le nom de l'employé
et


une description de l'activité. Donc malgré tous les autres champs que
je


souhaite obtenir dans le résultat de ma requête, comment dois-je faire
pour

avoir un regroupement sur la dernière activité basé uniquement sur mon
champ

act_serv_id.

Excusez-moi de ne pas avoir été assez précis






Avatar
Denis P
Désolé, je me suis trompé quelque peu. la requête doit être

SELECT act_serv_id, act_heure, act_description, MAX(act_id)
FROM Activite
WHERE act_id IN ( SELECT MAX(act_id) FROM Activite GROUP BY act_serv_id)
GROUP BY act_serv_id, act_heure, act_description

Même ici je dois ajouter le GROUP BY avec tous les champs du SELECT sinon il
y a erreur, je trouve cela un peu aberrant la façon de fonctionner du GROUP
BY. Un GROUP BY dans une sous-requête et il faut ajouter un GROUP BY dans
la requête principale avec tous les champs. Vraiment où les ingénieurs
avaient la tête lorsqu'ils ont conçu ce principe.

@ +

Denis P
"Denis P" a écrit dans le message de
news:
Bonjour Raymond, effectivement act_id est un numéro auto, le problème
c'est

justement que Access refuse que je groupe seulement sur act_serv_id. Ça
serait tellement simple si on pouvait le faire. Donc je dois inclure dans
le Group By tous les champs que j'ai placé dans le SELECT sinon j'obtiens
une erreur. Je me demande bien pourquoi les SGBD ne permettent pas de
grouper seulement sur un champ dans la clause GROUP BY.

Finalement, la seule solution que j'ai trouvé c'est d'inclure une
sous-requête dans ma requête. Ce qui donne ceci

SELECT act_serv_id, act_heure, act_description, MAX(act_id)
FROM Activite
WHERE act_id IN ( SELECT MAX(act_id) FROM Activite GROUP BY act_serv_id)

De cette façon j'obtiens seulement les enregistrements que je désire.

Merci de t'être penché sur mon problème.

@ +

Denis P
"Raymond [mvp]" a écrit dans le message de
news:ujB%
Je viens de relire plusieurs fois ton post, le act_id est bien un
numauto


?
si tu tries acsendant sur ce champ, en groupant sur act_serv_id ,
l'enregistrement à garder est bien le dernier ? donc si on met
l'opération


dernier sur tous les champs on doit récupérer les dernières valeurs
enregustrées. si le numauto n'est pas bon, un tri sur la date devrait
aller.


--
@+
Raymond Access MVP
http://access.seneque.free.fr/
http://access2003.free.fr/
http://users.skynet.be/mpfa/ pour une meilleure
efficacité de tes interventions sur MPFA


"Denis P" a écrit dans le message de
news:
Désolé j'avais trop simplifié ma demande, c'est un peu plus compliqué
que


cela en fait. Dans la réalité dans la table Activite j'ai plusieurs
autre

champs que je récupère, comme par exemple la date, le nom de l'employé
et


une description de l'activité. Donc malgré tous les autres champs que
je


souhaite obtenir dans le résultat de ma requête, comment dois-je faire
pour

avoir un regroupement sur la dernière activité basé uniquement sur mon
champ

act_serv_id.

Excusez-moi de ne pas avoir été assez précis










Avatar
Raymond [mvp]
chaque select part de la table complète il faut bien grouper.

le champ act_description n'est pas un champ memo ? car il va être tronqué à
255 caractères s'il est mémo.

--
@+
Raymond Access MVP
http://access.seneque.free.fr/
http://access2003.free.fr/
http://users.skynet.be/mpfa/ pour une meilleure
efficacité de tes interventions sur MPFA


"Denis P" a écrit dans le message de
news:%
Désolé, je me suis trompé quelque peu. la requête doit être

SELECT act_serv_id, act_heure, act_description, MAX(act_id)
FROM Activite
WHERE act_id IN ( SELECT MAX(act_id) FROM Activite GROUP BY act_serv_id)
GROUP BY act_serv_id, act_heure, act_description

Même ici je dois ajouter le GROUP BY avec tous les champs du SELECT sinon
il

y a erreur, je trouve cela un peu aberrant la façon de fonctionner du
GROUP

BY. Un GROUP BY dans une sous-requête et il faut ajouter un GROUP BY dans
la requête principale avec tous les champs. Vraiment où les ingénieurs
avaient la tête lorsqu'ils ont conçu ce principe.



Avatar
Michel Walsh
Salut,


A-t-on essayé une des quatre méthodes expliquées dans
http://www.mvps.org/accessfr/queries/qry0020.htm ?


Espérant être utile,
Vanderghast, Access MVP


"Denis P" wrote in message
news:%
Bonjour tout le monde,

Supposons une table Activite lié à une table Service. La table Activité
enregistre chaque activité pour un service.

Table Activité

act_id
act_serv_id
act_heure

Je veux récupérer de la table activité la dernière activité pour chaque
service ainsi que l'heure de l'activité. Disons que le contenu de la table
ressemble à ceci

act_id act_serv_id act_heure
1 1 10:00
2 1 13:00
3 2 11:30
4 1 16:15
5 2 15:45

Je voudrais donc que le résultat de ma requête me donne

act_id act_serv_id act_heure
4 1 16:15
5 2 15:45

Si je fais une requête pour récupérer seulement la dernière activité pour
chaque service sans tenir compte de l'heure pas de problème je fais

SELECT act_serv_id, MAX(act_id)
FROM Activite
GROUP BY act_serv_id

Par contre si je fais la même chose en ajoutant l'heure, alors là
j'obtiens

tous les enregistrements puisque l'heure est différente pour chacun.

SELECT act_serv_id, act_heure, MAX(act_id)
FROM Activite
GROUP BY act_serv_id, act_heure

Puisque je suis obligé de mettre et le service et l'heure dans la clause
GROUP BY, forcément je reçois tous les enregistrements.

Donc il doit bien avoir une façon de regrouper mes enregistrements pour
obtenir seulement la dernière activité pour chaque service en ayant
l'heure

de cette activité d'inclus dans le résultat de ma requête.

Merci pour vos toujours précieuses suggestions.

Denis P




Avatar
Denis P
Merci pour ce site

Un de plus dans mes références, qui me sera sûrement très utile comme bien
d'autre

Denis P
"Michel Walsh" a écrit dans le message
de news:
Salut,


A-t-on essayé une des quatre méthodes expliquées dans
http://www.mvps.org/accessfr/queries/qry0020.htm ?


Espérant être utile,
Vanderghast, Access MVP


"Denis P" wrote in message
news:%
Bonjour tout le monde,

Supposons une table Activite lié à une table Service. La table Activité
enregistre chaque activité pour un service.

Table Activité

act_id
act_serv_id
act_heure

Je veux récupérer de la table activité la dernière activité pour chaque
service ainsi que l'heure de l'activité. Disons que le contenu de la
table


ressemble à ceci

act_id act_serv_id act_heure
1 1 10:00
2 1 13:00
3 2 11:30
4 1 16:15
5 2 15:45

Je voudrais donc que le résultat de ma requête me donne

act_id act_serv_id act_heure
4 1 16:15
5 2 15:45

Si je fais une requête pour récupérer seulement la dernière activité
pour


chaque service sans tenir compte de l'heure pas de problème je fais

SELECT act_serv_id, MAX(act_id)
FROM Activite
GROUP BY act_serv_id

Par contre si je fais la même chose en ajoutant l'heure, alors là
j'obtiens

tous les enregistrements puisque l'heure est différente pour chacun.

SELECT act_serv_id, act_heure, MAX(act_id)
FROM Activite
GROUP BY act_serv_id, act_heure

Puisque je suis obligé de mettre et le service et l'heure dans la clause
GROUP BY, forcément je reçois tous les enregistrements.

Donc il doit bien avoir une façon de regrouper mes enregistrements pour
obtenir seulement la dernière activité pour chaque service en ayant
l'heure

de cette activité d'inclus dans le résultat de ma requête.

Merci pour vos toujours précieuses suggestions.

Denis P