Précédent   Forum des professionnels en informatique > Bases de données > DB2
DB2 Forum d'entraide technique sur la base de données DB2. Voir aussi -> Rubrique DB2
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 26/03/2007, 13h57   #1
Invité de passage
 
Inscription : décembre 2002
Messages : 1
Détails du profil
Informations forums :
Inscription : décembre 2002
Messages : 1
Points : 0
Points : 0
Par défaut Select MAx ?

Bonjour,

Je dois retrouver la première valeur d'une table qui contient plusieurs dates :

Voici un exemple de la table

Cle Date Valeur
A 20050110 5
A 20060220 6
B 20060515 9
C 20041020 3
C 20051015 7

Je dois retrouver
Cle Date Valeur
A 20060220 6
B 20060515 9
C 20051015 7


J'ai essayé plusieures requêtes du style :

Select t.cle, t.date, t.valeur
from TBL t,
table (select cle, MAX(date) from TBL group by cle, date) tmp
where t.cle = tmp.cle and t.date = tmp.date

Mais c'est fort lourd.
Est-ce que vous avez une idée pour alléger la sauce ?

Bien à vous
Serge
Delch est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/03/2007, 17h57   #2
Membre Expert
 
Inscription : novembre 2004
Messages : 1 298
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 1 298
Points : 1 355
Points : 1 355
Code :
1
2
3
4
SELECT cle, max(date), max(valeur) 
FROM MaTable
GROUP BY cle                                 
ORDER BY cle
Tout simplement !
Mercure est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/03/2007, 23h07   #3
Membre du Club
 
Inscription : août 2006
Messages : 56
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : août 2006
Messages : 56
Points : 55
Points : 55
Citation:
Tout simplement !
Attention, dans l'exemple ici , çà marche parce que le MAX(date) et le MAX(valeur) sont dans la même ligne (ex: A 20060220 6) et c'est le cas pour toutes les clés de l'exemple .
Prennons les valeurs suivantes:

A 20050110 9
A 20060220 5
A 20060220 4

Le query donnera:

A 20060220 9 -> mélange des lignes, ce n'est pas forcément ce que l'on recherche. le MAX(date) ne correspondant plus au MAX(valeur).

Le query le plus approprié sera
- si l'on considère que la date prime sur la valeur (soit la valeur maximum à la dernière date)

Select a.cle, a.date, max(a.valeur)
from matable a
where a.date in (select max(b.date) from matable b
where a.cle = b.cle)
group by a.cle
order by a.cle

- si l'on considère que la valeur prime sur la date (soit la dernière date pour la valeur maximum):

Select a.cle, max(a.date), a.valeur
from matable a
where a.valeur in (select max(b.valeur) from matable b
where a.cle = b.cle)
group by a.cle
order by a.cle

Evidement les performances du query seront différentes.

.
ALHER est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/03/2007, 14h50   #4
Membre Expert
 
Inscription : novembre 2004
Messages : 1 298
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 1 298
Points : 1 355
Points : 1 355
ALHER,
Delch a donné un échantillon de sa table où ne figure aucun doublon sur la colonne date ni sur la colonne valeur. Je suis parti du fait que, puisque c'est un échantillon, le cas des doublons dates et/ou valeurs devrait y figurer. Or, il n'y figure pas.
Et même s'ils existent, la requête que tu proposes ne fonctionnerait pas. Il manque la date ou la valeur sur le group by et la requête ne fonctionne que dans le cas où plusieurs lignes existent pour une même clé avec dates et/ou valeurs différentes. Selon l'exemple que tu donnes, les lignes non doublonnées sur la clé ne figurent pas dans le résultat de tes requêtes. En reprenant les données ton exemple et en y ajoutant la date sur le group by :
Code :
1
2
3
4
5
6
Select a.cle, a.date, max(a.valeur)
from matable a
where a.date in (select max(b.date) from matable b
where a.cle = b.cle)
group by a.cle, a.date
order by a.cle
la requête ci-dessus n'affichera que la ligne
Code :
1
2
CLE  DATE        MAX ( A . VALEUR ) 
 A   2006-02-20          5
et la ligne
Code :
1
2
CLE  DATE        VAL 
 A   2005-01-10    9
sera perdue.

J'attends la réaction de Delch pour savoir s'il y a lieu, comme tu le proposes, de distinguer une date et/ou une valeur particulière si doublons de dates et/ou valeurs sur la même clé.
Mercure est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/03/2007, 15h31   #5
Membre du Club
 
Inscription : août 2006
Messages : 56
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : août 2006
Messages : 56
Points : 55
Points : 55
Citation:
Il manque la date ou la valeur sur le group by
Effectivement! j'ai oublié la date où la valeur dans le group by

Citation:
ce n'est pas forcément ce que l'on recherche
Mercure, je voulais simplement attiré l'attention sur le mélange des lignes, et forcer la réflexion sur les données que l'on peux avoir et le résultat que l'on veux obtenir.

Nous illustrons donc 3 cas:

- une date maximun et un valeur maximum (indépendantes) pour une clé donnée.
- une clé, une date maximum et la valeur maximum pour cette date.
- une clé, la valeur maximum et la date maximum pour cette valeur

A Delch de voir
ALHER est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h58.


 
 
 
 
Partenaires

Hébergement Web