如何在PostgreSQL查询中对不同元组排序

如何在PostgreSQL查询中对不同元组排序,sql,postgresql,distinct-on,Sql,Postgresql,Distinct On,我试图在Postgres中提交一个只返回不同元组的查询。在我的示例查询中,对于集群id/提要id组合,如果条目多次存在,我不希望出现重复条目。如果我做一个简单的例子: select distinct on (cluster_info.cluster_id, feed_id) cluster_info.cluster_id, num_docs, feed_id, url_time from url_info join cluster_info on (cluster_inf

我试图在Postgres中提交一个只返回不同元组的查询。在我的示例查询中,对于集群id/提要id组合,如果条目多次存在,我不希望出现重复条目。如果我做一个简单的例子:

select distinct on (cluster_info.cluster_id, feed_id) 
   cluster_info.cluster_id, num_docs, feed_id, url_time 
   from url_info 
   join cluster_info on (cluster_info.cluster_id = url_info.cluster_id) 
   where feed_id in (select pot_seeder from potentials) 
   and num_docs > 5 and url_time > '2012-04-16';
我明白了,但我也想根据
num\u docs
进行分组。因此,当我执行以下操作时:

select distinct on (cluster_info.cluster_id, feed_id) 
   cluster_info.cluster_id, num_docs, feed_id, url_time 
   from url_info join cluster_info 
   on (cluster_info.cluster_id = url_info.cluster_id) 
   where feed_id in (select pot_seeder from potentials) 
   and num_docs > 5 and url_time > '2012-04-16' 
   order by num_docs desc;
我得到以下错误:

ERROR:  SELECT DISTINCT ON expressions must match initial ORDER BY expressions
LINE 1: select distinct on (cluster_info.cluster_id, feed_id) cluste...

我想我理解为什么会出现错误(除非我以某种方式明确描述组,否则无法按元组分组),但我该如何做到这一点?或者,如果我对错误的解释不正确,是否有办法实现我的初始目标?

最左边的
ORDER BY
项目不能与
DISTINCT
子句中的项目不一致。我引述:

表达式上的
DISTINCT必须与最左边的
ORDER BY
表达式。ORDER 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;
如果
c.cluster\u id、feed\u id
是您在
SELECT
列表中包含列的所有(在本例中都是)表的主键列,那么这只适用于PostgreSQL9.1或更高版本


否则,您需要按
对其余列进行分组,或聚合或提供更多信息

我想我需要你提到的分组,因为我在你的第二个答案中得到了以下错误:错误:列“c.num_docs”必须出现在GROUP BY子句中或用于聚合函数您的第一个答案出现以下错误:错误:SELECT DISTINCT ON表达式必须与表达式的初始顺序匹配第3行:SELECT DISTINCT ON(c.cluster_id,feed_id)@WildBill:您可能错过了第一次查询的更新。我修正了第一个版本中的一个错误。至于第二个问题:如果您提供了缺少的信息,哪些列属于哪个表,哪些主键以及您的PostgreSQL版本,我的答案可能会更具体。谢谢您的帮助和参考!对于一张只有2800万行的桌子来说,这简直是太慢了。。。有没有更快的解决方案?在联接之后,列值的变化上有很多重复项。我们希望按这些列排序,并根据主键(id)返回不同的行。这似乎不是一种性能可接受的方式。。。
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;