sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur man beställer distinkta tupler i en PostgreSQL-fråga

Längst till vänster ORDER BY objekt kan inte stämma överens med objekten i DISTINCT klausul. Jag citerar handboken om DISTINCT kod> :

Försök:

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;

Eller använd 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;

Om c.cluster_id, feed_id är de primära nyckelkolumnerna för alla (båda i det här fallet) tabeller som du inkluderar kolumner från i SELECT list, då fungerar detta bara med PostgreSQL 9.1 eller senare.

Annars måste du GROUP BY resten av kolumnerna eller samla eller ge mer information.




  1. Är det möjligt att läsa en CLOB från en fjärrbaserad Oracle-databas?

  2. Kan jag få Ecto att logga rå SQL?

  3. Oracle Trigger Infoga/uppdatering

  4. Laravels tidsstämpel uppdateras utan explicit uppmaning att göra det