Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
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 14/02/2011, 17h28   #1
Candidat au titre de Membre du Club
 
Inscription : octobre 2010
Messages : 14
Détails du profil
Informations forums :
Inscription : octobre 2010
Messages : 14
Points : 10
Points : 10
Par défaut select avec MAX

Bonjour,

J'ai une table MY_TABLE avec des champs appelés ID, VALUE_DATE et QUANTITY.
Pour une VALUE_DATE donnée, j'ai par exemple plusieurs ID possibles et donc plusieurs QUANTITY.

Ce que je veux faire, c'est une requête qui me donne, pour chaque VALUE_DATE compris entre une date de départ et une date d'arrivée, la QUANTITY dont l'ID est le plus grand

J'avais pensé à quelque chose du genre :
Code :
1
2
3
4
5
  SELECT MAX(ID), VALUE_DATE, QUANTITY
    FROM MY_TABLE
   WHERE VALUE_DATE >= '01/01/2009'
     AND VALUE_DATE <= '01/01/2010'
GROUP BY VALUE_DATE, QUANTITY
J'ai un doute sur le "group by", et aussi je ne sais pas si cette requête fait réellement ce que j'attends d'elle ^^ Si quelqu'un peut me confirmer ou me corriger, je le remercie d'avance !
admax00 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2011, 19h10   #2
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 459
Points : 10 459
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Cela ne donnera pas le résultat attendu.

Êtes-vous sûr de votre besoin : le besoin le plus courant est de chercher l'ID qui a la plus grande quantité.

Pour vous aider, il faut d'abord écrire une première requête qui retourne le plus grand ID par date, puis effectuer une jointure avec votre même table sur ces deux colonnes afin d'aller chercher la quantité correspondante.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2011, 13h05   #3
Candidat au titre de Membre du Club
 
Inscription : octobre 2010
Messages : 14
Détails du profil
Informations forums :
Inscription : octobre 2010
Messages : 14
Points : 10
Points : 10
Mon besoin est effectivement différent du cas courant.

Je m'explique : l'ID correspond à un calcul, et un même identifiant donne lieu à toute une série de VALUE_DATE.

Ce que je souhaite c'est chercher la QUANTITY pour une date donnée, sachant que si l'on trouve deux ID possibles on prendre l'ID maximum.

Si je travaille avec une seule date donnée, par exemple la première '01/01/2009', la requete est :

Code :
SELECT QUANTITY FROM MY_TABLE WHERE VALUE_DATE='01/01/2009' AND CALC_ID=( SELECT MAX(CALC_ID) FROM MY_TABLE WHERE VALUE_DATE='01/01/2009' )
Seulement je veux optimiser la recherche sur toute une plage de dates; et non pas lancer une requete pour chaque date, d'où ma question..
admax00 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2011, 13h40   #4
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 459
Points : 10 459
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Ok pour la précision, mais ma réponse reste la même :
Citation:
Pour vous aider, il faut d'abord écrire une première requête qui retourne le plus grand ID par date, puis effectuer une jointure avec votre même table sur ces deux colonnes afin d'aller chercher la quantité correspondante.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2011, 15h07   #5
Candidat au titre de Membre du Club
 
Inscription : octobre 2010
Messages : 14
Détails du profil
Informations forums :
Inscription : octobre 2010
Messages : 14
Points : 10
Points : 10
merci pour la réponse, mais n'étant pas un expert en SQL j'aimerais bien connaitre le contenu précis de cette requête... Et est-ce que ce sera au final une seule requête (complexe) ou bien une boucle puis une requête pour chaque étape de la boucle ? le but recherché étant la rapidité d'exécution.

Par ailleurs, en testant la requête que j'ai écrite au début du message, elle semble fonctionner ...
admax00 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2011, 15h39   #6
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 459
Points : 10 459
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Ce sera une seule requête, pas vraiment complexe.
J'aurai préféré que vous trouviez tout seul cela dit, surtout que votre première requête était encourageante !
Code :
1
2
3
4
5
6
7
8
9
SELECT m2.id, m2.value_date, m2.quantity
  FROM ( SELECT max(id) AS id_max, value_date
           FROM my_table
          WHERE value_date >= '01/01/2009'
            AND value_date <= '01/01/2010'
       GROUP BY value_date) m1
       INNER JOIN my_table m2 
         ON m2.id         = m1.id_max
        AND m2.value_date = m1.value_date
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 15/02/2011, 16h30   #7
Candidat au titre de Membre du Club
 
Inscription : octobre 2010
Messages : 14
Détails du profil
Informations forums :
Inscription : octobre 2010
Messages : 14
Points : 10
Points : 10
ok merci beaucoup, je testerai cela ! Il fallait voir le coup de la jointure INNER ^^. par contre à quoi correspond du coup ma première requête ?! Ne donne-t-elle pas le même résultat (avec un contre-exemple à l'appui)? ok ok c'est à moi de réfléchir mais bon ! PS: je code en C++ des méthodes de chargement des données, et le SQL je connais moins!
admax00 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2011, 17h16   #8
Membre éclairé
 
Homme Jérémy
Étudiant
Inscription : octobre 2009
Messages : 236
Détails du profil
Informations personnelles :
Nom : Homme Jérémy
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : octobre 2009
Messages : 236
Points : 322
Points : 322
Juste en optimisation mais,
Code :
1
2
WHERE value_date >= '01/01/2009'
            AND value_date <= '01/01/2010'
vaut aussi bien,
Code :
WHERE value_date BETWEEN '01/01/2009' AND '01/01/2010'
gwharl est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h40.


 
 
 
 
Partenaires

Hébergement Web