Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL > Requêtes
Requêtes Forum d'entraide sur les requêtes SQL spécifiques à PostgreSQL, les triggers, les vues, etc.
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 04/11/2011, 09h39   #1
Membre du Club
 
Inscription : décembre 2007
Messages : 147
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 147
Points : 42
Points : 42
Par défaut le comportement de la fonction first_value

bonjour,

j'aimerais savoir si la fonction first_value se comporte ainsi ou c'est moi qui l'applique mal.

admettons ces données :

Code :
1
2
3
4
5
COL1	COL2
a	1
a	3
a	2
b	2
l'idée en fait serait que le résultat de ma requête soit :


du coup j'utilise la fonction first_value()

mais j'ai l'impression qu'il me renvoie la première valeur de l'ensemble des lignes :


existe-t-il une fonction qui pourrait répondre à mon besoin ?

merci de votre aide.

sai
saigon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/11/2011, 09h57   #2
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 641
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 641
Points : 2 634
Points : 2 634
Bonjour,

Il me semble que DISTINCT ON pourrai répondre à votre besoin.

Code :
1
2
3
4
 
SELECT DISTINCT ON (col1) col1, col2
FROM ma_table
ORDER BY col1, col2

http://www.postgresql.org/docs/9.1/s...l#SQL-DISTINCT

Ceci étant dit c'est du spécifique pgsql.
En SQL normatif il faudrai passer par des fonctions de fenetrage
Code :
1
2
3
4
5
6
7
8
9
 
WITH tmp AS (
SELECT col1, col2, 
row_number() over(partition BY col1 ORDER BY col1, col2) AS rnk
FROM ma_table)
 
SELECT * 
FROM tmp
WHERE rnk = 1
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/11/2011, 10h18   #3
Membre du Club
 
Inscription : décembre 2007
Messages : 147
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 147
Points : 42
Points : 42
merci.

le problème avec DISTINCT ON c'est que pour un résultat de 10000 lignes si je mets COL2 en paramètre du ON PGSQL va me sortir uniquement 3 lignes si dans COL2 je n'ai que 3 valeurs uniques...

L'idée serait que pour chaque groupe sortir la première valeur et non la première valeur que le curseur voit pour l'appliquer à chaque ligne...
saigon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/11/2011, 10h20   #4
Modérateur
 
Inscription : octobre 2008
Messages : 1 508
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 508
Points : 2 040
Points : 2 040
En quoi est-ce que le très basique:
Code :
SELECT col1, min(col2) FROM TABLE GROUP BY col1
ne répond pas à la question?
estofilo est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 04/11/2011, 10h25   #5
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 641
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 641
Points : 2 634
Points : 2 634
Gnii ?

Avez-vous essayé les deux propositions ?
Car ca devrait répondre à votre besoin.

Concernant le distinct on je ne mettrai pas la col2 dedans.


sur la 2eme y a une petite erreur, il faudra l'écrire comme ça (trompé dans l'order by)

Code :
1
2
3
4
5
6
7
8
9
 
WITH tmp AS (
SELECT col1, col2, 
row_number() over(partition BY col1 ORDER BY col2) AS rnk
FROM ma_table)
 
SELECT * 
FROM tmp
WHERE rnk = 1
sinon pour le first_value() le principe est décrit ici http://lalystar.developpez.com/fonct...ytiques/#L3.10
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/11/2011, 10h28   #6
Membre du Club
 
Inscription : décembre 2007
Messages : 147
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 147
Points : 42
Points : 42
Citation:
Envoyé par estofilo Voir le message
En quoi est-ce que le très basique:
Code :
SELECT col1, min(col2) FROM TABLE GROUP BY col1
ne répond pas à la question?
lol...euh en tout...putain me suis pris la tête pour rien

merci !

bon juste pour ma culture...à quoi sert la fonction first_value() du coup ?
saigon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/11/2011, 17h32   #7
Membre confirmé
 
Homme Arnaud Benhamdine
Directeur technique
Inscription : octobre 2004
Messages : 157
Détails du profil
Informations personnelles :
Nom : Homme Arnaud Benhamdine
Localisation : France

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

Informations forums :
Inscription : octobre 2004
Messages : 157
Points : 263
Points : 263
Ben à avoir la 1ère valeur de l'agrégat, et pas le minimum.
Vous deviez avoir un pb de tri sur votre premier essai.

Cdlt, Arnaud.

Citation:
Envoyé par saigon Voir le message
lol...euh en tout...putain me suis pris la tête pour rien

merci !

bon juste pour ma culture...à quoi sert la fonction first_value() du coup ?
Arnaud B. est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h01.


 
 
 
 
Partenaires

Hébergement Web