SELECT, MAX & GROUP BY

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : SELECT, MAX & GROUP BY

par Invité » 30 mars 2007, 12:47

Ok, ryle bien vu.

Ta requete fonctionne parfaitement.
Juste une petite chose avec mysql, la sous requete doit être un alias.
J'ai ajouté "As tbl"

soit

Code : Tout sélectionner

SELECT dt, COUNT(id_annonce) FROM ( SELECT id_annonce, MAX(dt) AS dt FROM calendrier GROUP BY id_annonce ) AS tbl GROUP BY dt

Merci encore ryle pour ta colaboration.
Eloise.

par Ryle » 29 mars 2007, 13:50

Ah bah pour les clauses WHERE, c'est à toi de voir, je sais pas ce que tu veux filtrer moi :)

Quant au FROM, il est bien présent dans la sous requête et interroge la table calendrier, quant à la requête principale, elle utilise le résultat de la sous-requêtes comme s'il s'agissait d'une table ou plus exactement d'une vue.

Ainsi la sous requête te retourne l'id et la date de dernière parution de chaque annonce.
Et dans ce résultat, la requête principale va compter pour chaque date distincte le nombre d'id associés :)

par Eloise » 28 mars 2007, 19:55

En résumé, tu veux compter le nombre d'annonces arrivant à expiration quand un jour donné est égal à la date d'expiration.

Voilà ta requête posée en français.
Tu n'as plus qu'à la transcrire en SQL.

Pas tout à fait.
La date d'expiration n'est pas donnée par contre doit être retrouvée parmi toute les journées de parution enregistrées dans la table.


Pas tout à fait... si j'ai bien compris, il n'y a pas de date donnée. Ce qu'elle attend, c'est pour la dernière date de chaque ID (donc la date max) connaitre le nombre d'éléments qui se terminent à cette date, c'est à dire qui ont la même date max

Exacte c'est bien çà...
Et c'est pour ça que j'avais proposée d'utiliser la fonction MAX dans mon premier post. On n'y arrive... :wink:

Code : Tout sélectionner

SELECT dt, COUNT(id_annonce) FROM ( SELECT id_annonce, MAX(dt) AS dt FROM calendrier GROUP BY id_annonce ) GROUP BY dt

Oui, peut être qques chose dans ce genre avec une requête imbriquée.
Par contre, ce que tu proposes a l'air incomplet. Il me manque les tables (FROM ???) et probablement la clause WHERE.


Toujours à la recherche de cette fameuse reqûete.

Cordialement,
Eloise

par Ryle » 28 mars 2007, 15:06

Pas tout à fait... si j'ai bien compris, il n'y a pas de date donnée. Ce qu'elle attend, c'est pour la dernière date de chaque ID (donc la date max) connaitre le nombre d'éléments qui se terminent à cette date, c'est à dire qui ont la même date max.

Pour moi, il faudrait donc passer par une sous-requête (si ta version de mysql le permet) ramenant les dernières date de chaque id, et qui ensuite comptera le nombre d'enregistrement par date. Quelque chose du genre :

Code : Tout sélectionner

SELECT dt, COUNT(id_annonce) FROM ( SELECT id_annonce, MAX(dt) AS dt FROM calendrier GROUP BY id_annonce ) GROUP BY dt

par pjl » 28 mars 2007, 13:30

En résumé, tu veux compter le nombre d'annonces arrivant à expiration quand un jour donné est égal à la date d'expiration.

Voilà ta requête posée en français.
Tu n'as plus qu'à la transcrire en SQL.

par Eloise » 28 mars 2007, 12:08

Merci Ryle de bien vouloir t'interesser à mon problème.

Mais la requete que tu propose ne correspond pas à ce que j'attends.

Donc je vais essayer de m'expliquer plus clairement.

Pour rendre visible ou non mes petites annonces, je m'appuie sur une bdd qui contient toutes les journées de parution pour chaque annonce.
Les journées ne sont pas toujours consécutives, d'ou ce systeme.

ex: l'annonce 45 paraît le 24/01/2007 & 12/06/2007
=> sa date d'expiration est donc le 12/06/2007.
A cette meme date, l'annonce 126 arrive à expiration.


DATE.................ID_Anonces
2007-11-02.......154
2007-01-24....... 45
2007-06-12........45
2007-03-27....... 45
2007-06-12 ......126
2007-03-14.......126


Je veux pouvoir recuperer la date d'expiration et le nombre d'annonce arrivant à expiration pour cette date.
Soit

2007-11-02.....1 => 1seule annonce arrive à expiration à cette date(154)
2007-06-12.....2 => 2 annonces arrive à expiration à cette date(126 & 45)


Je veux donc toutes les dates ayant au moin 1 annonce qui arrive à expiration à cette date

Voila, j'éspère être plus claire.
Mais je n'ai tjrs pas trouvé la bonne requête et pourtant la structure ne peut pas être plus simple je pense (1 table & 2 champs) :o


Eloise

par Ryle » 28 mars 2007, 00:02

La commande group by permet de dire à la requête de regrouper des données identiques, lorsqu'une partie de celle-ci sont soumises à des fonctions de groupes. Ex :

Code : Tout sélectionner

SELECT article, categorie, SUM(qte), COUNT(id) FROM ma_table WHERE ... GROUP BY article, categorie
Dans cette requête, SUM(qte) et COUNT(id) sont des fonctions de groupe. Il me faut donc spécifier explicitement que je veux appliquer une fonction de groupe sur les autres éléments, sans quoi ma requête ne fonctionnera pas (encore qu'avec MySQL, elle fonctionnera peut être, mais sans garantie des résultats...). On ajoute donc les autres champ dans le GROUP BY.

Dans ton cas, il te faut juste compter le nombre d'id par date, pas besoin de max(), il te faut par contre juste mettre la date dans le group by :

Code : Tout sélectionner

SELECT dt, COUNT( id_annonce ) AS cpt FROM calendrier GROUP BY dt
Et si éventuellement tu ne veux que les deux ou trois dernières dates, il suffit de rajouter un ORDER BY dt DESC pour les trier par ordre de date décroissante, et un LIMIT 0,2 pour ne ramener que les 2 dernières :

Code : Tout sélectionner

SELECT dt, COUNT( id_annonce ) AS cpt FROM calendrier GROUP BY dt ORDER BY dt DESC LIMIT 0,2

SELECT, MAX & GROUP BY

par Eloise » 27 mars 2007, 18:48

Je me prends la tete depuis qques heures avec une requête de séléction sur une table qui contient seulement 2 champs. :?

Et pourtant, je galère serieusement.

J'ai un champ date de type DATE et un second champ id de type INT.
Le champ id et date peuvent contenir des doublons.
  • DATE.................ID
    2007-11-02.......154
    2007-06-12........45
    2007-03-27....... 45
    2007-06-12 ......126
    2007-01-24....... 45
    2007-03-14.......126

RESULTAT ATTENDU:
  • DATE .............ID
    2007-11-02......1
    2007-06-12......2


Peut être pas évident à expliquer
Pour prendre un exemple concret:
Je travaille sur un site de petites annonces
et il s'agit de determiner le nombre d'annonce qui arrive à éxpiration à une date donnée.
L'ID correspond à l'id de l'annonce et la date correspond aux diiférentes dates de parution.

Avez vous une une requête à me proposer ??

Différente requête téstée mais sans succes
SELECT MAX( dt ) , COUNT( id_annonce ) AS cpt
FROM calendrier
GROUP BY id_annonce