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 :

MAX(DATE) d'un GROUP BY portant sur l'UNION de plusieurs tables.


Sujet :

Langage SQL

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1
    Points : 1
    Points
    1
    Par défaut MAX(DATE) d'un GROUP BY portant sur l'UNION de plusieurs tables.
    Bonjour,

    Je me permets de vous demander votre aide car malgré de nombreuses recherches, je n'ai pu trouver de solution à mon problème.

    En quelques mots, j'ai 4 tables (alpha, beta, gamma, delta), chacune contenant 2 colonnes (NomServeur, DateEntree).
    Chaque table pouvant contenir plusieurs fois le même nom de serveur (mais alors avec une date d'entrée différentes). Ces même serveurs pouvant également se trouver dans d'autres tables.

    Ce que j'aimerais obtenir c'est une table avec 3 colonnes:
    1) Nom de la table où a été trouvé la date la plus récente pour le serveur nommé en colonne 2.
    2) Nom de chaque serveur apparaisant au moins une fois dans une des 4 table
    3) Date d'entrée la plus récente trouver pour le serveur nommé en colonne 2.

    Exemple:
    TABLE | NomServeur | DateEntree
    -------------------------------------------
    ALPHA | S1 | 2013-02-09
    ALPHA | S2 | 2013-03-24
    BETA | S3 | 2013-07-12
    ALPHA | S5 | 2013-02-02

    Explication:
    - 1ere ligne: Peu importe si S1 se trouvait sur une ou plusieurs table (et même plusieurs fois dans la même), c'est sur la table BETA que la date la plus récente pour ce serveur a été trouvée et c'est 2013-02-09.
    - 2e ligne: Peu importe si S2 se trouvait sur une ou plusieurs table (et même plusieurs fois dans la même), c'est sur la table BETA que la date la plus récente pour ce serveur a été trouvée et c'est 2013-03-24.
    - 3e ligne: Peu importe si S3 se trouvait sur une ou plusieurs table (et même plusieurs fois dans la même), c'est sur la table BETA que la date la plus récente pour ce serveur a été trouvée et c'est 2013-07-12.
    - Et ainsi de suite...

    Pour info, en utilisant un GROUP BY sur la TABLE et NomServeur, j'obtiens ceci:
    TABLE | NomServeur | DateEntree
    ----------------------------------------------------------
    ALPHA | S1 | 2013-02-09
    BETA | S1 | 2013-01-09
    DELTA | S1 | 2013-01-03

    ALPHA | S2 | 2013-03-24
    ALPHA | S3 | 2013-03-30
    BETA | S3 | 2013-07-12
    ALPHA | S5 | 2013-02-02

    Comme vous pouvez le voir, S1 et S3 sont présent plusieurs fois alors que j'aimerais ne garder que la table dans la date est la plus récente...
    J'espère que mes explications sont assez claire pour que vous puissiez m'aider.

    Merci d'avance.
    Solvap

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour,
    Quel résultat souhaite tu pour le jeu de test suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    TABLE | NomServeur | DateEntree
    -------------------------------------------
    ALPHA | S1 | 2013-02-09
    ALPHA | S2 | 2013-03-24
    BETA  | S3 | 2013-07-12
    ALPHA | S5 | 2013-02-02
    BETA  | S1 | 2013-02-09
    A savoir un serveur présent dans deux tables avec la même date et c'est la date max.
    Tu veux deux lignes pour S1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    TABLE | NomServeur | DateEntree
    -------------------------------------------
    ALPHA | S1 | 2013-02-09
    BETA  | S1 | 2013-02-09
    ou
    une des deux , mais selon quels critères?

    Cordialement
    Soazig

  3. #3
    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 388
    Points
    18 388
    Par défaut
    @Sovap : Quel est votre SGBD ?

    @soazig : de ce que j'ai compris, le regroupement est par table, pas par serveur.
    La question pour trancher serait de choisir dans ces deux lignes :
    TABLE | NomServeur | DateEntree
    -------------------------------
    ALPHA | S1         | 2013-02-09
    ALPHA | S2         | 2013-02-09
    Edit : non en fait il y a les deux cas.
    Votre cas couvre la question n°2, la mienne la question n°1.

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 882
    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 882
    Points : 53 063
    Points
    53 063
    Billets dans le blog
    6
    Par défaut
    Soyez correct et respectez les règles de postage SVP !
    http://www.developpez.net/forums/ann....php?f=37&a=69

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CREATE TABLE alpha (NomServeur CHAR(16), DateEntree DATE);
    CREATE TABLE gamma (NomServeur CHAR(16), DateEntree DATE);
    CREATE TABLE delta (NomServeur CHAR(16), DateEntree DATE);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    INSERT INTO alpha VALUES 
    ('S1', '2013-02-09'), 
    ('S2', '2013-03-24'), 
    ('S3', '2013-03-30'), 
    ('S5', '2013-02-02');
     
    INSERT INTO gamma VALUES 
    ('S1', '2013-01-09'),
    ('S3', '2013-07-12');
     
    INSERT INTO delta VALUES 
    ('S1', '2013-01-03');
    Une solution :
    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
    18
     
    WITH
    T_UNI AS
    (
    SELECT 'alpha' AS "TABLE", * FROM alpha
    UNION ALL
    SELECT 'gamma' AS "TABLE", * FROM gamma
    UNION ALL
    SELECT 'delat' AS "TABLE", * FROM delta
    ),
    T_ORD AS
    (
    SELECT *, ROW_NUMBER() OVER(PARTITION BY NomServeur ORDER BY DateEntree DESC) AS N
    FROM   T_UNI
    )
    SELECT "TABLE", NomServeur, DateEntree
    FROM   T_ORD 
    WHERE  N = 1
    A +

Discussions similaires

  1. Réponses: 1
    Dernier message: 03/02/2010, 15h13
  2. Requete sur l'union de deux tables.
    Par sabotage dans le forum Langage SQL
    Réponses: 4
    Dernier message: 29/09/2008, 10h51
  3. Réponses: 1
    Dernier message: 09/04/2007, 16h56
  4. Réponses: 3
    Dernier message: 13/12/2006, 18h05
  5. [FireBird] Requête portant sur une saison parmi plusieurs
    Par Lucien dans le forum Langage SQL
    Réponses: 7
    Dernier message: 30/08/2006, 10h22

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