我需要一些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,
答案 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
中每一行(通常是主键)的列。
最小或最大函数以伪随机方式从表中选择一行。