2014-03-06 193 views
0

我需要一些PostgreSQL查詢幫助。 我有4個表涉及它:客戶,organization_complete,實體和地址。我從每個人,這個查詢檢索的一些數據:PostgreSQL - 具有聚合函數的查詢

SELECT distinct ON (c.customer_number, trim(lower(o.name)), a.street, a.zipcode, a.area, a.country) 
           c.xid AS customer_xid, o.xid AS entity_xid, c.customer_number, c.deleted, o.name, o.vat, 'organisation' AS customer_type, a.street, a.zipcode, a.city, a.country 
      FROM customer c 
      INNER JOIN organisation_complete o ON (c.xid = o.customer_xid AND c.deleted = 'FALSE') 
      INNER JOIN entity e ON e.customer_xid = o.customer_xid 
      INNER JOIN address a ON (a.contact_info_xid = e.contact_info_xid and a.address_type = 'delivery') 
      WHERE c.account_xid = "<value>" 

我得到一個不同的CUSTOMER_NUMBER,名稱,街道,郵政編碼,區域和國家(什麼是DISTINCT ON語句後指定)分裂的所有客戶。 我現在需要檢索的是所有客戶在數據庫上有一個加倍的行,但我也需要檢索customer_xid和entity_xid,它們是各個表的主鍵,因此是唯一的。出於這個原因,他們不能被包含到一個聚合函數中。我需要的是統計每個不同元組具有相同customer_number,name,street,zipcode,area和country的行數,並且只選擇計數大於1的元組。 對於每個選定的元組,我還需要採取customer_xid和entity_xid,隨意,像MySQL會在這樣的查詢用的A_Key做:

SELECT COUNT(*), tab.a_key, tab.b, tab.c from tab 
WHERE 1 
GROUP BY tab.b 

我知道MySQL是關於這相當一個例外,我只是想知道是否有可能獲得PostgreSQL上的結果相同。

感謝,

L.

+1

MySQL不是那麼壞,即使它不會運行該查詢,請糾正它。 –

+0

該查詢在MySQL上運行... –

+0

哇,我得到了currious,只是自己測試了查詢。它。真。作品。我知道MySQL壞了,但是_that_壞了?!? @JakubKania好像我的+1對你的評論有點太快... – DrColossos

回答

1

該查詢在MySQL是使用非標準(參見下面的註釋) 「MySQL會機羣」:http://dev.mysql.com/doc/refman/5.0/en/group-by-extensions.html

SELECT COUNT(*), tab.a_key, tab.b, tab.c 
from tab 
WHERE 1 
GROUP BY tab.b 

注:這是SQL:2003 Standard中定義的一個功能,如T301功能依賴關係,它並不是標準所要求的,許多RDBMS不支持它,包括PostgreSql(請參閱此鏈接的9.3版 - 不支持的功能:http://www.postgresql.org/docs/9.3/static/unsupported-features-sql-standard.html)。


上面的查詢可以在PostgreSQL中被表達以這種方式:

SELECT tab.a_key, tab.b, tab.c, 
     q.cnt 
FROM (
    SELECT tab.b, 
      COUNT(*) As cnt, 
      MIN(tab.unique_id) As unique_id /* could be also MAX */ 
    from tab 
    WHERE 1 
    GROUP BY tab.b 
) q 
JOIN tab ON tab.unique_id = q.unique_id 

其中unique_id是唯一地標識在tab每一行(通常是主鍵)的柱。
最小或最大函數以僞隨機方式從表中選擇一行。

+0

根據SQL-2003標準,它不再是非標準擴展,但是,謝謝,這是我需要的一個很好的提示:) –

+0

@ lucone83感謝您指出,我不知道,我已經更新了我的答案。 – krokodilko