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 :

Optimisation requête sql


Sujet :

Langage SQL

  1. #1
    Membre éclairé Avatar de hugoclo
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    615
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 615
    Par défaut Optimisation requête sql
    Bonjour,
    J'effectue une requête sur une Bdd Oracle et j'obtiens ce résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Id	|Pst	        |Date
    AAAA	|	+	| 10/06/2015
    AAAA	|	=	| 09/06/2015
    AAAA	|	-	| 07/06/2015
    AAAA	|	+	| 06/06/2015
    AAAA	|	-	| 29/12/2014
    BBBB	|	=	| 25/01/2015
    BBBB	|	=	| 24/01/2015
    BBBB	|	-	| 21/01/2015
    BBBB	|	-	| 11/01/2015
    BBBB	|	-	| 10/03/2015
    J'utilise "GROUP by Id, Order by Date desc"
    Ce que je souhaiterais obtenir c'est uniquement pour chaque id la ligne la plus récente.

    Cordialement

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 010
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 010
    Billets dans le blog
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Id, MAX(DATE)
    FROMGROUP BY Id
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    bonjour,

    Lisez le blog d'Escartefigue sur le sujet : https://www.developpez.net/forums/bl...cente-critere/

  4. #4
    Membre éclairé Avatar de hugoclo
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    615
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 615
    Par défaut
    Bonsoir,
    Merci d'avoir pris le temps de m'aider.
    Je me suis appuyé sur le tuto et plus particulièrement sur ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
      SELECT B7IDEN                       
           , B7CPTE                       
           , B8SEQN                       
           , B8MONT                       
           , B8DTHR                       
      FROM TBB7                           
      INNER JOIN TBB8  B8                 
        ON  B8IDEN = B7IDEN               
      WHERE B8DTHR =                      
           (SELECT MAX(B8DTHR)            
            FROM TBB8 S8                  
            WHERE S8.B8IDEN = B8.B8IDEN)
    Bonne soirée

  5. #5
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 954
    Par défaut
    Pour oracle utilisez plutôt la requête proposée par Waldar

  6. #6
    Membre éclairé Avatar de hugoclo
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    615
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 615
    Par défaut
    Bonjour,
    Je reviens 1 ans après, mais cette année a été tellement bizarre!!

    Je m'étais mal exprimé dans ma demande initiale.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    Id	|Pst	        |Date
    AAAA	|	+	| 10/06/2015
    AAAA	|	=	| 09/06/2014
    AAAA	|	-	| 07/06/2015
    AAAA	|	+	| 06/06/2015
    AAAA	|	-	| 29/12/2014
    BBBB	|	=	| 25/01/2015
    BBBB	|	=	| 24/01/2015
    BBBB	|	-	| 21/01/2015
    BBBB	|	-	| 11/01/2015
    BBBB	|	=	| 10/03/2015
    CCCC	|	+	| 10/01/2020
    CCCC	|	+	| 11/01/2020
    CCCC	|	-	| 12/01/2020
    CCCC	|	=	| 13/01/2020
    CCCC	|	-	| 14/01/2020
    ce que je veux (souhaite) c'est récupérer les id pour lesquels Pst = '=' et Date = 'la plus récente'
    dans mon exemple je requête ne me retournerait que BBBB

    Merci

  7. #7
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Euh...

    Si tu veux que les "=", alors :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select id, pst, max(date)
    from latable
    where pst = '='
    group by id, pst

    Pour le coup tu n'as plus besoin de choses complexes.

  8. #8
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    A mon avis c'est plutôt ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      select Id
           , max(pst) keep(dense_rank first order by date desc) as pst
           , max(date) as date
        from matable
    group by Id
      having max(pst) keep(dense_rank first order by date desc) = '=';
    Ou de façon normative puisqu'on est sur le forum SQL général :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    with cte_matable as
    (
    select Id, pst, date
         , row_number() over(partition by Id order by date desc) as rn
      from matable
    )
    select Id, pst, date
      from cte_matable
     where pst = '='
       and rn  = 1;

  9. #9
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Je maintiens que si on veut le max(date) pour pst = '=', il ne reste qu'un seul ID possible par ligne, donc pas la peine de passer par du fenêtrage : un bête id, pst, max(date) suffit

  10. #10
    Membre émérite
    Femme Profil pro
    Service informatique presque à moi seule (TPE), ex-architecte fonctionnel
    Inscrit en
    Août 2017
    Messages
    358
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 57
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Service informatique presque à moi seule (TPE), ex-architecte fonctionnel
    Secteur : Finance

    Informations forums :
    Inscription : Août 2017
    Messages : 358
    Par défaut
    Si j'ai bien compris la demande il s'agit de récupérer seulement les id dont le 'Pst' le plus récent vaut '='.

    En sql de base d'il y a trente ans, ça fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select t1.id
    from latable t1
    where t1.Pst = '='
    and t1.date = (select max(t2.date)
                         from latable t2
                         where t2.id= t1.id)
    Et on ne récupère bien que BBBB, puisque les 'Pst' les plus récents de AAAA et CCCC valent respectivement '+' et '-'.
    Tandis qu'avec le group by id, pst, on récupère la date la plus récente où l'opération fut '=' pour chaque id (1 ligne par id dont il existe au moins un Pst '=').
    On ignore si c'est aussi le plus récent de tous les 'Pst' de l'id.

    Team Waldar.

Discussions similaires

  1. Optimisation requête SQL
    Par ludo00002 dans le forum SQL
    Réponses: 2
    Dernier message: 06/10/2008, 09h01
  2. Comment optimiser requête SQL avec création Index
    Par schumi101 dans le forum SQL
    Réponses: 25
    Dernier message: 11/12/2007, 21h28
  3. optimisation requête SQL
    Par marti dans le forum Oracle
    Réponses: 4
    Dernier message: 27/04/2006, 08h54
  4. Besoin d'aide pour optimiser requête SQL
    Par Keuf95 dans le forum Langage SQL
    Réponses: 10
    Dernier message: 06/09/2005, 16h02
  5. optimisation requête SQL!!! help!!
    Par anathem62 dans le forum Requêtes
    Réponses: 2
    Dernier message: 24/05/2004, 16h26

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