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 :

Dernières lignes plusieurs types de ligne


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    175
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 175
    Points : 108
    Points
    108
    Par défaut Dernières lignes plusieurs types de ligne
    Bonjour,

    J'ai pas mal lu de posts sur les requêtes devant retourner le dernier enregistrement, mon problème est un peu différent :

    J'ai une table dont les colonnes sont les suivantes :
    ID NAME VALEUR HORODATE

    NAMEc'est le nom d'un lieu de mesure
    NAME c'est une valeur de mesure correspondant au lieu
    HORODATE c'est la date à laquelle la mesure a été effectuée

    Mon problème : pour chaque lieu, je souhaite récupérer la dernière mesure, pour l'instan j'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select
    	name,valeur
    from
    	MATABLE AS T
    where
    	horodate=(select Max(horodate) from MATABLE AS U and t.name = u.name)
    Mais la requête est extrêmement longue, comment l'optimiser svp ?

    Merci.

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 453
    Points : 18 394
    Points
    18 394
    Par défaut
    Quelle est la volumétrie de votre table ?
    Avez-vous un index sur les champs name et/ou horodate ?

    La syntaxe suivante devrait être plus rapide :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT T.name, T.valeur
    FROM MATABLE AS T
    INNER JOIN (select name, max(horodate) AS horomax
                  FROM MATABLE GROUP BY name) AS U
           ON T.name = U.name
         AND T.horodate = U.horomax
    Si votre SGBD le permet avec un WITH celà pourrait être encore un peu plus rapide :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    WITH U AS 
    (select name, max(horodate) AS horomax
    FROM MATABLE GROUP BY name)
    SELECT T.name, T.valeur
    FROM MATABLE AS T INNER JOIN U
          ON T.name = U.name
         AND T.horodate = U.horomax
    Et il y a aussi une solution avec les fonctions analytiques (petite recherche nécessaire).

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 920
    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 : 21 920
    Points : 51 712
    Points
    51 712
    Billets dans le blog
    6
    Par défaut
    En constituant un index sur le couple de colonne (name, horodate).

    A +

  4. #4
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut !

    Citation Envoyé par Waldar Voir le message
    Et il y a aussi une solution avec les fonctions analytiques (petite recherche nécessaire).
    Et je parie très fort que la version fonction analytique est la plus rapide !
    Parce que le window sort pushed rank, ça arrache. Surtout s'il y a le fameux index dont tout le monde parle


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT * FROM (
    SELECT
    	name,valeur, row_number() OVER(PARTITION BY name ORDER BY horodate DESC) AS rk
    FROM
    	MATABLE) T
    WHERE rk = 1

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 453
    Points : 18 394
    Points
    18 394
    Par défaut
    Citation Envoyé par pacmann Voir le message
    Surtout s'il y a le fameux index dont tout le monde parle
    Avec la fonction analytique, je ne suis pas certain que l'index soit utilisé.
    Ca serait intéressant de le vérifier.

    Tient par contre, par rapport à la requête proposée par rodbeck, si horodate n'est pas utilisé autant faire un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select distinct name, value from MaTable
    J'imagine que c'est pendant la transcription de la requête qu'il y a eu un couac.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    175
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 175
    Points : 108
    Points
    108
    Par défaut
    L'index a grandement amélioré les perfs effectivement

    Merci !

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

Discussions similaires

  1. Ecrire un fichier avec plusieurs types de ligne
    Par guicecal dans le forum Développement de jobs
    Réponses: 6
    Dernier message: 11/01/2011, 12h27
  2. Requete permettant de renvoyer sur une ligne plusieur valeurs
    Par shaun_the_sheep dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 13/02/2007, 16h09
  3. Plusieurs sauts de ligne à la suite
    Par gedeon555 dans le forum Mise en forme
    Réponses: 3
    Dernier message: 28/12/2006, 20h28
  4. [VB]Ouvrir plusieurs forms et ligne de commande
    Par cd090580 dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 11/03/2006, 19h53
  5. Réponses: 4
    Dernier message: 02/09/2004, 22h43

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