Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
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 22/06/2011, 16h34   #1
Invité de passage
 
Inscription : juin 2010
Messages : 16
Détails du profil
Informations forums :
Inscription : juin 2010
Messages : 16
Points : 0
Points : 0
Par défaut Requete sql pour trouver le min

Bonjour

Je voudrais une requête qui me permet de tirer le min d'une date par ID produit
sachant que la table initiale est le résultat d'un requete SQL. donc ça sera deux requêtes en une seule.
voici la table résultante de la première requete

id année prix
1 2005 38
1 2006 15
2 2004 24
1 2009 14
2 2001 12
2 1995 75

et voici ce que je voudrais avoir

id année prix
1 2005 38
2 1995 75


Je vous remercie d'avance.
helgo59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/06/2011, 16h58   #2
Expert Confirmé
 
Avatar de 7gyY9w1ZY6ySRgPeaefZ
 
Homme
dba
Inscription : juillet 2007
Messages : 2 520
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : dba

Informations forums :
Inscription : juillet 2007
Messages : 2 520
Points : 3 967
Points : 3 967
allez voir un cours SQL sur GROUP BY avec MIN
__________________
les règles du forum - mode d'emploi du forum
Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs.
(Rappel : "ça ne marche pas" n'est pas un message d'erreur)
JE NE RÉPONDS PAS aux questions techniques par message privé.
Écrire en français sur un forum est une marque minimale de respect.
7gyY9w1ZY6ySRgPeaefZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/06/2011, 17h01   #3
Membre du Club
 
Inscription : novembre 2006
Messages : 131
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : novembre 2006
Messages : 131
Points : 51
Points : 51
Salut,

Quelque chose comme ça :

Code :
1
2
3
4
SELECT id, MIN(année) annee, prix
FROM TaTable
WHERE tesCriteres
GROUP BY id, prix
NB : n'oublies pas de placer toute les colonnes qui ne sont pas dans l'agrégat MIN() au niveau de ton GROUP BY
jowsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/06/2011, 17h05   #4
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour

Pouvez vous nous donner la requête en question et éventuellement la structure des tables ?


Une piste en attendant :
Code SQL :
1
2
3
4
5
6
 
SELECT
    id,
    annee,
    MIN(prix) OVER (PARTITION BY annee)
FROM ...
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/06/2011, 17h10   #5
Membre du Club
 
Inscription : novembre 2006
Messages : 131
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : novembre 2006
Messages : 131
Points : 51
Points : 51
Citation:
Envoyé par jowsuket Voir le message
Salut,

Quelque chose comme ça :

Code :
1
2
3
4
SELECT id, MIN(année) annee, prix
FROM TaTable
WHERE tesCriteres
GROUP BY id, prix
NB : n'oublies pas de placer toute les colonnes qui ne sont pas dans l'agrégat MIN() au niveau de ton GROUP BY
Effectivement ma requête n'est pas correcte, on ne doit pas grouper le prix... Désolé pour la fausse information.
jowsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/06/2011, 17h47   #6
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
heu... en fait en relisant le post initial(et surtout en regardant l'exemple), je me rend compte que la mienne non plus

se serait plutôt quelque chose du genre (en supposant qu'il existe une table produit contenant la liste des produits, sans doublon):

Code SQL :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
SELECT 
    P.id,
    M.annee,
    M.prix
FROM Produit P
CROSS APPLY(
    SELECT TOP(1)
        annee,
        prix
    FROM LaTable T
    WHERE T.idProduit = P.idProduit
    ORDER BY annee
) M
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/06/2011, 18h21   #7
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 954
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 954
Points : 17 774
Points : 17 774
CROSS APPLY et TOP 1 !!!
Bravo, tu cumules les horreurs !!!!!!!!!!
Pour le coup je te met -1 tant que tu n'aura pas modifié ta requête... na !

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/06/2011, 11h28   #8
Membre à l'essai
 
Inscription : juin 2006
Messages : 12
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : juin 2006
Messages : 12
Points : 23
Points : 23
il existe surement une manière plus "Propre" (SQLPro va certainement nous la proposer) mais celle-ci fonctionne.

Code :
1
2
3
4
5
6
7
8
 
SELECT ID, Annee, Prix
FROM (
        SELECT  ID, Annee, Prix, 
                ROW_NUMBER() OVER(PARTITION BY ID ORDER BY ANNEE) AS Row
        FROM  dbo.Test
) AS A
WHERE A.Row = 1
LapinClair est déconnecté   Envoyer un message privé Réponse avec citation 40
Vieux 23/06/2011, 12h20   #9
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 431
Points : 10 431
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Non LapinClair, votre solution est très bien et respecte la norme SQL.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2011, 14h05   #10
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Citation:
Envoyé par SQLpro Voir le message
CROSS APPLY et TOP 1 !!!
Bravo, tu cumules les horreurs !!!!!!!!!!
et j'assume
surtout quand les horreurs en question peuvent me sortir le résultat 10 voire 50 fois plus rapidement...


Citation:
Pour le coup je te met -1 tant que tu n'aura pas modifié ta requête... na !

A +
Par une autre aussi rapide ? là je sèche !

PS : c'est vrai que le TOP 1 fait affreux, mais pour des raisons que je ne m'explique pas, un MAX(Colonne) est nettement plus lent qu'un TOP(1) Colonne [...] ORDER BY colonne DESC...
aieeeuuuuu 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 05h41.


 
 
 
 
Partenaires

Hébergement Web