PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

So bestellen Sie verschiedene Tupel in einer PostgreSQL-Abfrage

Ganz links ORDER BY Elemente können nicht mit den Elementen des DISTINCT übereinstimmen Klausel. Ich zitiere das Handbuch zu DISTINCT :

Versuchen Sie:

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;

Oder verwenden Sie 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;

Wenn c.cluster_id, feed_id sind die Primärschlüsselspalten aller (in diesem Fall beider) Tabellen, aus denen Sie Spalten in SELECT einschließen list, dann funktioniert das nur mit PostgreSQL 9.1 oder später.

Andernfalls müssen Sie GROUP BY verwenden die restlichen Spalten oder aggregieren oder weitere Informationen bereitstellen.