sql >> Base de Datos >  >> RDS >> PostgreSQL

Cómo ordenar tuplas distintas en una consulta de PostgreSQL

El ORDER BY más a la izquierda los elementos no pueden estar en desacuerdo con los elementos del DISTINCT cláusula. Cito el manual sobre DISTINCT :

Prueba:

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;

O use 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 son las columnas de clave principal de todas las tablas (ambas en este caso) de las que incluye columnas en el SELECT lista, entonces esto solo funciona con PostgreSQL 9.1 o posterior.

De lo contrario, debe GROUP BY el resto de las columnas o agregar o proporcionar más información.