Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
#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
Pages : 1