IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

[Oracle] selection du max en groupand par date


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2003
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2003
    Messages : 57
    Points : 27
    Points
    27
    Par défaut [Oracle] selection du max en groupand par date
    Bonjour,

    J'ai une table contenant les carnets d'ordre d'actions boursieres dont j'aimerais afficher certains éléments...
    En gros ma table ressemble a ceci :

    Date ACHAT_VENTE PRIX
    12:51:50 ACHAT 28.08
    12:51:30 ACHAT 27.08
    12:51:20 ACHAT 28.05
    12:50:30 ACHAT 28.01
    12:51:50 VENTE 28.08
    12:51:30 VENTE 27.08
    12:51:20 VENTE 28.05
    12:50:30 VENTE 28.01

    Voila j'aimerais pouvoir selectionner la valeur maxi pour l'achat (respectivement vente) pour chaque minute....

    C'est a dire avoir en sortie quelque chose de ce genre :
    12:51 ACHAT 28.08
    12:50 ACHAT 28.01


    Quelqu'un peut il m'aider car je suis bloqué la dessus depuis hier soir....

  2. #2
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Date, ACHAT_VENTE, MAX(Prix)
    FROM laTable
    GROUP BY Date
    Remarque : Date est un mot réservé, il vaut mieux ne pas donner ce nom à une colonne (DateTransaction par exemple)

    Oops : pas réveillé ce matin, il faut bien sur extraire la date jusqu'à la minute, et la fonction pour faire cela dépend de ton SGBD, tous n'implémentant pas la syntaxe normée (EXTRACT)

  3. #3
    Futur Membre du Club
    Inscrit en
    Mai 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 7
    Points : 8
    Points
    8
    Par défaut
    Bonjour,

    Pour regrouper par heure/minute,
    J'essayerai bien quelque chose du genre :

    Select (date - second(date)) , ACHAT_VENTE, max( PRIX )
    group by (date - second(date)) , ACHAT_VENTE

    Reste à trouver la syntaxe exacte de (date - second(date)) qui renverra l'heure arrondie à la minute inférieure. Cette syntaxe dépend du SGBD.

    Bon courage.

  4. #4
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2003
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2003
    Messages : 57
    Points : 27
    Points
    27
    Par défaut
    Mediat > pour Date, en fait le nom que j'ai donné ne correspond pas au noms des colonnes

    Par contre je suis sous oracle et si je fais un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT dateheure, MAX(prix) 
    FROM carnet_ordre 
    GROUP BY TO_CHAR(dateheure, 'HH24:MI')
    Ca ne marche pas....
    De plus, je pense que si la requete avoisine ce que tu m'as donné j'arrete l'informatique..... Ou tout du moins j'arrete de programmer jusqu'a 2h du mat.....

  5. #5
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Sous ORACLE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT TO_CHAR(dateheure, 'HH24:MI'), MAX(prix) 
    FROM carnet_ordre 
    GROUP BY TO_CHAR(dateheure, 'HH24:MI');
    Mais ainsi cela mélange les ACHAT et les VENTES, si tu veux les distinguer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT TO_CHAR(dateheure, 'HH24:MI'), Achat_Vente, MAX(prix) 
    FROM carnet_ordre 
    GROUP BY TO_CHAR(dateheure, 'HH24:MI'), Achat_Vente;

  6. #6
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2003
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2003
    Messages : 57
    Points : 27
    Points
    27
    Par défaut
    Merci pour ta reponse....
    C'est effectivement cela..... Mais (il y a toujours un mais ) j'ai un autre soucis.... Car la requete finale a laquelle je veux aboutir est un peu plus compliqué.....

    Cette fois je donne la structure de la table :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      CODE VARCHAR2(10) 
      DATEHEURE DATE 
      ACHAT_VENTE VARCHAR(5) 
      RANG NUMBER
      PRIX NUMBER(8,2)
      QTITE_TITRE NUMBER (8)
      NOMBRE_ORDRE NUMBER (3)
    Le but de ma requete est comme dit precedemment d'afficher le max pour chaque minute....
    Je vais un peu compléter ce point....
    En fait dans la base de données sont stockés des données sur plusieurs mois (pas toujours complet)
    Le but de ma requete est d'afficher les 10 ( ou plus ) derniers ordres....
    Il faut donc pour chaque entrée selectionner afficher l'ensemble des valeurs...


    Avant j'effectuais une requete plus simple ou je prenais l'ensemble des dernieres valeurs sans les regrouper par minute :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    String fq1 = "SELECT TO_CHAR(dateheure, 'HH24:MI:SS') AS \"Heure\", nombre_ordre AS \"#Achat\", qtite_titre AS \"Qté\", TO_CHAR(prix, '9999.99') AS \"Prix\" 
    FROM carnet_ordre,titre WHERE titre.nom = '"+it+"' 
    AND titre.code = carnet_ordre.code"
     
    SELECT * 
    FROM ("+fq1+" AND achat_vente = 'ACHAT' ORDER BY dateheure DESC)
    WHERE ROWNUM <="+nbval;
    J'aimerais donc refaire cette meme requete mais en regroupant les minutes et en gardant uniquement le max (par rapport au prix pour chaque minute)....
    La reponse de Mediat est un debut de reponse mais je suis toujours bloqué

  7. #7
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2003
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2003
    Messages : 57
    Points : 27
    Points
    27
    Par défaut
    En fait je me suis aussi rendu compte d'un truc..... C'est qu'il faut trier au depart par date complete sinon les entrees de deux jours differents vont etre regroupés ensemble car meme heure.......

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    String query = "SELECT TO_CHAR(dateheure, 'YYYY-MM-DD HH24:MI'), MAX(prix) 
    FROM titre,carnet_ordre 
    WHERE titre.nom = 'AXA' AND titre.code = carnet_ordre.code 
    GROUP BY TO_CHAR(dateheure, 'YYYY-MM-DD HH24:MI') 
    ORDER BY TO_CHAR(dateheure, 'YYYY-MM-DD HH24:MI') DESC";
    Par contre j'ai toujours le meme probleme a savoir qu'il me faut recuperer toutes les autres données de la table a partir de celle ci....
    Le probleme etant que MAX(prix) peut se trouver plusieurs fois dans la table....


    J'avais essayé ca mais ca ne fonctionne pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    String fq = "SELECT MAX(prix) 
    FROM titre,carnet_ordre 
    WHERE titre.nom = 'AXA' AND titre.code = carnet_ordre.code 
    GROUP BY TO_CHAR(dateheure, 'YYYY-MM-DD HH24:MI')";
     
    String fq2 = "SELECT TO_CHAR(dateheure, 'YYYY-MM-DD HH24:MI') 
    FROM titre,carnet_ordre 
    WHERE titre.nom = 'AXA' AND titre.code = carnet_ordre.code 
    GROUP BY TO_CHAR(dateheure, 'YYYY-MM-DD HH24:MI')"    
     
    String query = "SELECT c1.code, TO_CHAR(c1.dateheure, 'HH24:MI'), c1.prix 
    FROM carnet_ordre c1 
    WHERE c1.prix IN ("+fq+") AND TO_CHAR(c1.dateheure, 'YYYY-MM-DD HH24:MI') IN ("+fq2+")";
    Mais le resultat n'est pas du tout bon.....

    Je viens aussi de penser a ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    String fq = "SELECT TO_CHAR(dateheure, 'YYYY-MM-DD HH24:MI') AS \"datec\",MAX(prix) AS \"prix\" 
    FROM titre,carnet_ordre 
    WHERE titre.nom = 'AXA' AND titre.code = carnet_ordre.code 
    GROUP BY TO_CHAR(dateheure, 'YYYY-MM-DD HH24:MI')";
     
    String query = "SELECT c1.code, TO_CHAR(c1.dateheure, 'HH24:MI'), c1.prix 
    FROM carnet_ordre c1, ("+fq+") f1 
    WHERE f1.datec = TO_CHAR(c1.dateheure, 'YYYY-MM-DD HH24:MI') AND f1.prix = c1.prix";
    Mais ca ne marche pas non plus......

  8. #8
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Merci de respecter les Conseils à lire avant de poster

    Pas de problème pour le SGBD ou la structure, mais en revanche tes requêtes sont illisibles formulées ainsi !

    Ajout : "ça ne marche pas" ne nous aide pas à t'aider, indique-nous plutôt clairement si tu rencontres une erreur (quel message) ou si les lignes retournées ne sont pas celles attendues (avec explications).

  9. #9
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2003
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2003
    Messages : 57
    Points : 27
    Points
    27
    Par défaut
    Désolé pour les requetes mais j'ai posté exactement ce que j'avais dans mes sources pour que l'on puisse m'aider "plus facilement"....
    J'utilise java et jdbc pour recuperer mes valeurs qui sont sur un serveur distant (via servlet).
    Mais je suis d'accord que c'est pas tres lisible....

    Pour les erreurs il n'y a rien qui s'affiche....

    Pour detailler les resultats obtenus :

    Pour la premiere requete je n'ai aucune reponse donc je suppose que c'est parce que le sgbdr n'as rien trouvé ?

    En ce qui concerne la seconde requete c'est la meme chose......

    Désolé si mes post n'etaient pas tres "complet" mais je n'ai pas vraiment plus d'infos que les requetes que j'essaye !

  10. #10
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2003
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2003
    Messages : 57
    Points : 27
    Points
    27
    Par défaut
    Bon j'ai recupéré les données du servlet et j'ai crée une table en local pour pouvoir entrer mes requetes sous sql*plus.....

    Je me suis trompé sur un point dans mes anciens posts....
    En fait pour chaque minute j'ai plusieurs valeurs pour une MEME SECONDE et il faut que je regroupe en prenant le max par SECONDE....

    Ainsi avec une structure de la sorte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    Date                ACHAT       RANG       PRIX QTITE_TITRE NOMBRE_ORDRE
    ------------------- ----- ---------- ---------- ----------- ------------
    13/01/2006 14:55:24 ACHAT          1      27,08        1704            1
    13/01/2006 14:55:24 ACHAT          2      27,07        9559            5
    13/01/2006 14:55:24 ACHAT          3      27,06        2988            2
    13/01/2006 14:55:24 ACHAT          4      27,05       22476            5
    13/01/2006 14:55:24 ACHAT          5      27,04        2106            3
    13/01/2006 14:55:29 ACHAT          1      27,08        1691            1
    13/01/2006 14:55:29 ACHAT          2      27,07        9559            5
    13/01/2006 14:55:29 ACHAT          3      27,06        2988            2
    13/01/2006 14:55:29 ACHAT          4      27,05       22476            5
    13/01/2006 14:55:29 ACHAT          5      27,04        2106            3

    Ma requete doit me renvoyer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Date                ACHAT       RANG       PRIX QTITE_TITRE NOMBRE_ORDRE
    ------------------- ----- ---------- ---------- ----------- ------------
    13/01/2006 14:55:24 ACHAT          1      27,08        1704            1
    13/01/2006 14:55:29 ACHAT          1      27,08        1691            1
    J'ai pour l'instant essayer de faire cela avec la requete suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT * FROM carnet_ordre,
    (SELECT TO_CHAR(dateheure, 'DD/MM/YYYY HH24:MI:SS') AS "dateh", MAX(prix) AS "price" FROM carnet_ordre GROUP BY TO_CHAR(dateheure, 'DD/MM/YYYY HH24:MI:SS')) t1
    WHERE carnet_ordre.dateheure = t1.dateh
    AND carnet_ordre.prix = t1.price;
    Mais sql*plus me renvoie ceci :
    SQL> SELECT * FROM carnet_ordre,
    2 (SELECT TO_CHAR(dateheure, 'DD/MM/YYYY HH24:MI:SS') AS "dateh", MAX(prix) AS "price" FROM carnet_ordre GROUP BY TO_CHAR(dateheure, 'DD/MM/YYYY HH24:MI:SS')) t1
    3 WHERE carnet_ordre.dateheure = t1.dateh
    4 AND carnet_ordre.prix = t1.price;
    AND carnet_ordre.prix = t1.price
    *
    ERREUR à la ligne 4 :
    ORA-00904: "T1"."PRICE" : identificateur non valide
    Voila je pense que cette fois j'ai été un peu plus clair.....

    P.S : j'ai édité les anciens post egalement.....

  11. #11
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2003
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2003
    Messages : 57
    Points : 27
    Points
    27
    Par défaut
    J'ai reussi !!!!!!
    En fait le probleme venait a priori des " " apres le AS....
    Si j'ai bien compris lorsqu'on fait un AS avec des guillemets on renomme le "titre" de la colonne et un AS sans guillemet on donne un nom a la colonne.....


    Quoiqu'il en soit voici la solution (si jamais ca peut aider d'autre) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT TO_CHAR(dateheure, 'DD/MM/YYYY HH24:MI:SS') AS "Date", achat_vente, rang, prix, qtite_titre, nombre_ordre
    FROM carnet_ordre c1,
      (SELECT TO_CHAR(dateheure, 'DD/MM/YYYY HH24:MI:SS') AS dateh, MAX(prix) AS price 
      FROM carnet_ordre cl 
      WHERE cl.achat_vente = 'ACHAT' 
      GROUP BY TO_CHAR(dateheure, 'DD/MM/YYYY HH24:MI:SS')) t1
    WHERE TO_CHAR(c1.dateheure, 'DD/MM/YYYY HH24:MI:SS') = t1.dateh
    AND c1.prix = t1.price;
    Merci toutefois pour votre aide !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 03/02/2009, 11h51
  2. trier par date max d'un client
    Par ccluz dans le forum Langage SQL
    Réponses: 14
    Dernier message: 08/02/2008, 16h36
  3. Selection par date/mois
    Par Faro dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 04/06/2007, 15h29
  4. Select Avec Max(date)
    Par Poisson59 dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 24/08/2006, 18h26
  5. selection par date
    Par adgabd dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 12/01/2004, 11h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo