PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment ordonner des tuples distincts dans une requête PostgreSQL

Le ORDER BY le plus à gauche les éléments ne peuvent pas être en désaccord avec les éléments du DISTINCT clause. Je cite le manuel sur DISTINCT :

Essayez :

SELECT *
FROM  (
    SELECT DISTINCT ON (c.cluster_id, feed_id) 
           c.cluster_id, num_docs, feed_id, url_time 
    FROM   url_info u
    JOIN   cluster_info c ON (c.cluster_id = u.cluster_id) 
    WHERE  feed_id IN (SELECT pot_seeder FROM potentials) 
    AND    num_docs > 5
    AND    url_time > '2012-04-16'
    ORDER  BY c.cluster_id, feed_id, num_docs, url_time
           -- first columns match DISTINCT
           -- the rest to pick certain values for dupes
           -- or did you want to pick random values for dupes?
    ) x
ORDER  BY num_docs DESC;

Ou utilisez GROUP BY :

SELECT c.cluster_id
     , num_docs
     , feed_id
     , url_time 
FROM   url_info u
JOIN   cluster_info c ON (c.cluster_id = u.cluster_id) 
WHERE  feed_id IN (SELECT pot_seeder FROM potentials) 
AND    num_docs > 5
AND    url_time > '2012-04-16'
GROUP  BY c.cluster_id, feed_id 
ORDER  BY num_docs DESC;

Si c.cluster_id, feed_id sont les colonnes de clé primaire de toutes les tables (les deux dans ce cas) dont vous incluez les colonnes dans le SELECT list, cela fonctionne uniquement avec PostgreSQL 9.1 ou plus tard.

Sinon, vous devez GROUP BY le reste des colonnes ou regrouper ou fournir plus d'informations.