PostgreSQL - 使用聚合函数进行查询

时间:2014-03-06 10:40:00

标签: sql postgresql

我需要一些PostgreSQL查询的帮助。 我有4个表参与其中:customer,organization_complete,entity和address。我从每个人那里检索了一些数据并使用此查询:

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 个答案:

答案 0 :(得分:1)

MySql中的此查询使用非标准(请参阅下面的注释)“MySql group by extension”: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中每一行(通常是主键)的列。
最小或最大函数以伪随机方式从表中选择一行。