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 :

Récupérer la valeur minimale de X colonnes


Sujet :

Langage SQL

  1. #1
    Membre averti
    Homme Profil pro
    Développeur
    Inscrit en
    Septembre 2007
    Messages
    497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 497
    Points : 330
    Points
    330
    Par défaut Récupérer la valeur minimale de X colonnes
    Bonjour,

    Un collègue vient de me poser une colle et je suis preneur si vous avez une solution simple.

    Il a une table TAB avec 5 colonnes ID,DATE1,DATE2,DATE3,DATE4,DATE5
    Chacune des dates a une valeur différente.

    Il souhaite connaitre la date minimale pour chaque ligne de l'ensemble des colonnes.

    Exemple
    ID | DATE1 | DATE2 | DATE3 | DATE4 | DATE5 |
    1 | 10/01/15 | 10/01/14 | 10/01/13 | 15/01/15 | 10/05/15 |
    2 | 10/01/13 | 10/01/15 | 10/01/15 | 10/01/10 | 10/01/11 |
    Pour 1, il souhaite trouver 10/01/13
    Pour 2, 10/01/10 etc...

    J'ai pensé par une table temp pour chaque ligne, mais sur 3 millions de lignes ca risque d'être un peu lent...

    Merci,

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Avec quel SGBD ? (Certains ont des fonctions pour cela, mais ça ne fait pas partie de la norme)
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre averti
    Homme Profil pro
    Développeur
    Inscrit en
    Septembre 2007
    Messages
    497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 497
    Points : 330
    Points
    330
    Par défaut
    Avec postgresql.

    PS : C'est bien ce que je me suis dit que j'avais déjà vu un truc du style PIVOT avec sqlserver
    PS2 : je suis preneur éventuellement d'une solution générique. C'est pour ma culture perso

  4. #4
    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
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    La solution générique, ce serait de revoir la modélisation, qui est en cause dans le problème présent : avec une modélisation correcte, le problème ne se poserait plus.

    En l'état, vous pouvez faire avec une série de UNION, comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    WITH LaTableBienModelisee AS (
            SELECT ID, 1 AS Num, DATE1 AS Dte
        UNION ALL  SELECT ID, 2 AS Num, DATE2
        UNION ALL  SELECT ID, 3 AS Num, DATE3
        UNION ALL  SELECT ID, 4 AS Num, DATE4
        UNION ALL  SELECT ID, 5 AS Num, DATE5
        FROM TAB
    )
    SELECT ID, MIN(Dte) AS MinDATE
    FROM LaTableBienModelisee 
    GROUP BY ID

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Il suffit d'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select id, least(DATE1, DATE2, DATE3, DATE4, DATE5) as dt_min
      from matable;
    C'est implémenté sous Oracle Database, PostgreSQL, MySQL, probablement DB2 également.

    N'existe pas sous SQL-Server (et c'est incompréhensible).

  6. #6
    Membre averti
    Homme Profil pro
    Développeur
    Inscrit en
    Septembre 2007
    Messages
    497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 497
    Points : 330
    Points
    330
    Par défaut
    Merci Waldar.

    aieeeuuuuu c'est grosso modo ce à quoi j'avais pensé.

  7. #7
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    Bonjour,

    La solution générique, ce serait de revoir la modélisation, qui est en cause dans le problème présent : avec une modélisation correcte, le problème ne se poserait plus.
    C'est quand même assez banal d'avoir plusieurs typologies de dates dans une table : date de création, date de signature, date de connaissement, date de livraison, date de facturation, date de révision...
    ce qui est moins courant est de chercher la plus petite d'entre elles, mais pourquoi pas

    Citation Envoyé par Waldar Voir le message
    Il suffit d'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select id, least(DATE1, DATE2, DATE3, DATE4, DATE5) as dt_min
      from matable;
    C'est implémenté sous Oracle Database, PostgreSQL, MySQL, probablement DB2 également.

    N'existe pas sous SQL-Server (et c'est incompréhensible).
    Existe effectivement pour DB2

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 14/02/2014, 14h43
  2. [Dojo] DataGrid récupérer la valeur d'une autre colonne
    Par iroze dans le forum Bibliothèques & Frameworks
    Réponses: 3
    Dernier message: 04/06/2010, 14h31
  3. Réponses: 12
    Dernier message: 21/05/2010, 13h36
  4. Réponses: 6
    Dernier message: 13/06/2008, 14h53
  5. Récupérer la valeur de la deuxième colonne
    Par PereNoel77 dans le forum IHM
    Réponses: 2
    Dernier message: 01/12/2007, 22h30

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