2010-03-02 4 views
1

Voici un échantillon de mes données:Requête SQL avec "Group by" et "max" et "join"?

CLIENT_ATTRIBUT:

ID_CLIENT | DATE_CLIENT | ATTRIBUT 
----------+-------------+--------- 
000000001 | 2010:03:01 | 0000010 
----------+-------------+--------- 
000000001 | 2010:02:16 | 0000010 
----------+-------------+--------- 
000000001 | 2010:03:04 | 0000011 
----------+-------------+--------- 
000000002 | 2010:03:01 | 0001000 
----------+-------------+--------- 

CLIENT:

ID_CLIENT | NOM_MARITAL | 
----------+-------------+ 
000000001 | PANTROMANI | 
----------+-------------+ 
000000002 | ELLOUQUIER | 
----------+-------------+ 

J'aimerais obtenir, pour chaque ID_CLIENT dans la table "CLIENT_ATTRIBUT":
ID_CLIENT, max (DATE_CLIENT) avec son "ATTRIBUT" correspondant, et "NOM_MARITAL"

So in t il exemple ci-dessus:

ID_CLIENT | DATE_CLIENT | ATTRIBUT | NOM_MARITAL | 
----------+-------------+----------+-------------+ 
000000001 | 2010:03:04 | 0000011 | PANTROMANI | 
----------+-------------+----------+-------------+ 
000000002 | 2010:03:01 | 0001000 | ELLOUQUIER | 

(je travaille avec Mysql, mais je suppose que cela ne devrait pas être différent avec tout système de base de données)

+1

Odeur comme des devoirs et a été répondu sur ce site de nombreuses fois. – Select0r

+0

Il est malheureux que ce soit MySQL, dans postgresql vous pourriez 'SELECT DISTINCT ON (id_client) date_client, attribut, non_marital FROM client_attribut JOIN client UTILISER (id_client) ORDER BY date_client DESC'. Ce serait massivement plus rapide et plus clair que la solution actuelle. –

+0

Voir [cette question similaire] (http://stackoverflow.com/questions/2341659/problem-joining-tables-where-joined-table-needs-to-be-ordered-before-grouping) pour les réponses. –

Répondre

2

Vous devriez être en mesure d'utiliser une sous-requête comme suit:

SELECT 
    client.id_client, 
    sub_query.date_client, 
    client_attribut.attribut, 
    client.nom_marital 
FROM 
    client 
INNER JOIN 
    (SELECT 
     client_attribut.id_client, 
     MAX(client_attribut.date_client) as date_client 
    FROM 
     client_attribut 
    GROUP BY 
     client_attribut.id_client) 
    AS sub_query ON (sub_query.id_client = client.id_client) 
INNER JOIN 
    client_attribut ON (client_attribut.id_client = sub_query.id_client AND 
         client_attribut.date_client = sub_query.date_client); 
+0

On dirait que cette solution ne donne pas la bonne valeur "ATTRIBUT": Dans l'exemple ci-dessus, il donnerait "0000010" au lieu de "0000011" pour ID_CLIENT = "000000001" – dangolive

+0

@dangolive: Ma faute! Fixé maintenant –

+0

Merci beaucoup, il fait le travail maintenant! Encore un peu compliqué pour moi, je vais l'étudier de plus près :) – dangolive

Questions connexes