Vous n'êtes pas identifié(e).

#1 12/04/2012 17:12:53

ilrico
Membre

ORDER BY hors du scope de DISTINCT ON

Bonjour,

Dans la doc PostgreSQL, il est indiqué que :


DISTINCT ON ( expression [, ...] ) keeps only the first row of each set of rows where the given expressions evaluate to equal. The DISTINCT ON expressions are interpreted using the same rules as for ORDER BY (see above). Note that the "first row" of each set is unpredictable unless ORDER BY is used to ensure that the desired row appears first. For example:

SELECT DISTINCT ON (location) location, time, report
    FROM weather_reports
    ORDER BY location, time DESC;

retrieves the most recent weather report for each location. But if we had not used ORDER BY to force descending order of time values for each location, we'd have gotten a report from an unpredictable time for each location.

The DISTINCT ON expression(s) must match the leftmost ORDER BY expression(s). The ORDER BY clause will normally contain additional expression(s) that determine the desired precedence of rows within each DISTINCT ON group.

Or ce que je cherche à faire est d'avoir les résultats 'location' uniques (elles sont déjà uniques, le DISTINCT ON vient du fait que le résultat venant d'un select multi-tables, j'ai les doublons), mais le tout ordonné par 'time' : ie avoir 'time' comme premier filtre de classement (en absolu, pas pour chaque 'location') : actuellement, mon résultat est ordonné par 'location'.

J'espère être clair dans ma question, sinon je le reformulerai !

Merci !

Hors ligne

#2 13/04/2012 10:52:55

ilrico
Membre

Re : ORDER BY hors du scope de DISTINCT ON

en fait ce que je veux faire est du style :
SELECT location FROM (
   SELECT location, time FROM weather_reports GROUP BY location)
ORDER BY time;

mais question est : il y a-t-il une autre manière de faire plus "propre" (j'ai toujours l'impression que les requetes imbriquées sont un peu bricolage, mais je ne suis pas suffisement expert pour comprendre dans quelle mesure ce n'est qu'une impression.

Hors ligne

#3 13/04/2012 11:20:57

gleu
Administrateur

Re : ORDER BY hors du scope de DISTINCT ON

J'aurais tendance à utiliser ça :

SELECT distinct (location), time from weather_reports order by time;

Vous pouvez aussi faire (à partir de la 8.4) :

with req as (select location, time from weather_reports group by location, time)
select location from req order by time;

Guillaume.

Hors ligne

#4 13/04/2012 13:06:47

ilrico
Membre

Re : ORDER BY hors du scope de DISTINCT ON

MERCI !
en effet ma première pensée venait à utiliser
SELECT DISTINCT (location) time FROM weather_reports ORDER  BY time;

ce qui me semblait le plus logique, mais oublliant la virgule entre apres le (location)  :  j'ai eu un message d'erreur qui m'a laisser penser que la logique était mauvaise, d'où les complications qui on suivit.

dans mon exemple, location est unique, et les doublons provenant de jointures.
supposons que location n'est pas unique, nous devrions utiliser un DISTINCT ON (location) location, time ... ORDER BY time pour avoir les 'locations' les plus recents (comem expliqué dans la doc)
mais comment les classer ensuite ? une requete imbriquee semble indispensable, pour reprendre votre seconde proposition :
WITH req AS (SELECT DISTINCT ON (location) location, time FROM weather_reports ORDER BY location, time DESC) SELECT location FROM req ORDER BY time;

n'est-ce pas ?

par ailleurs pour revenir aux questions de performances, et à votre post précédent, voyez-vous des raisons à des performances différentes entre vos deux propositions ?

Dernière modification par ilrico (13/04/2012 13:07:10)

Hors ligne

#5 13/04/2012 13:16:13

gleu
Administrateur

Re : ORDER BY hors du scope de DISTINCT ON

Pour les performances, aucune idée. Il faudrait voir le plan d'exécution de chaque requête.


Guillaume.

Hors ligne

Pied de page des forums