2012-05-04 31 views
0

我想要一列的计数,并且我在FROM子句中有5列,但它给出了错误的计数,因为我已经包含了所有在from子句中的列。我不想在GROUP BY子句中使用特定的列。PostgreSQL中的计数问题

如果我从组中删除该列BY子句它引发以下错误:

ERROR: column "pt.name" must appear in the GROUP BY clause or be used in an aggregate function LINE 1: SELECT distinct on (pu.id) pu.id, pt.name as package_name, c...

例如为:

SELECT DISTINCT ON (a) a,b,c,count(d),e 
FROM table GROUP BY a,b,c,d,e ORDER BY a 

从这个我想从GROUP BY取出即

如何从GROUP BY中删除该列,以便可以正确计数?

+0

我对使用'(a)'和'group by'的独特性有点困惑。你能解释一点吗? –

+0

我是PostgreSQL的新手。你能给我建议任何解决方案。我怎样才能得到列d的计数。 –

+0

如果我不知道你的目标是什么,那么很难给你一个解决方案。使用真正的列名和真正的查询,描述相关表之间的关系 - 然后它会更容易帮助你。 –

回答

3

重读该问题后更新。
您在混合GROUP BYDISTINCT ON。你想(我是如何理解它)有什么可以用window functionDISTINCT ON相结合来完成:

SELECT DISTINCT ON (a) 
     a, b, c 
    , count(d) OVER (PARTITION BY a, b, c) AS d_ct 
    , e 
FROM tbl 
ORDER BY a, d_ct DESC; 

窗口功能需要的PostgreSQL 8.4矿石后。

这里会发生什么?

  1. 伯爵在d_ct多少(a,b,c)套相同也有在与d非空值的表。
  2. a选择一行。如果您不是ORDER BY不只是a,将会挑选一个随机的行。
  3. 在我的例子中,我选择了ORDER BYd_ct DESC另外,所以挑选出具有最高d_ct的集合中的伪随机行。

另外,略有不同的解释,你可能需要的东西,用GROUP BY

SELECT DISTINCT ON (a) 
     a, b, c 
    , count(d) AS d_ct 
    , min(e) AS min_e    -- aggregate e in some way 
FROM t 
GROUP BY a, b, c 
ORDER BY a, d_ct DESC; 

GROUP BYDISTINCT ON之前应用,所以结果是非常相似的一个上面,只e/min_e的值不同。

+0

非常感谢Erwin .. :) –