2012-05-04 76 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 .. :) –