繁体   English   中英

如何从单个查询返回多个聚合,所有聚合都有不同的约束?

[英]How to return multiple aggregates from a single query, all with different constraints?

假设我有一个包含商店交易的表。

如何计算其中包含“ cracker”一词的交易数量,其中包含“ soda”的交易数以及其中同时包含“ cracker”和“ soda”的交易数。

如果可能,这应该在单个查询中。

您可以为此使用conditional aggregation

select 
   sum(case when field like '%crackers%' then 1 else 0 end) crackercount,
   sum(case when field like '%soda%' then 1 else 0 end) sodacount,
   sum(case when field like '%soda%' 
             and field like '%crackers%' then 1 else 0 end) bothcount
from yourtable

Postgres 9.4或更高版本中,使用专用的聚合FILTER子句

SELECT count(*) FILTER (WHERE col ILIKE '%crackers%') AS ct_cracker
     , count(*) FILTER (WHERE col ILIKE '%soda%')     AS ct_soda
     , count(*) FILTER (WHERE col ILIKE ALL ('{%crackers%, %soda%}'::text[]) AS ct_both
FROM   tbl
WHERE  col ILIKE ANY ('{%crackers%, %soda%}'::text[]);

有两种标准技术也可用于较旧版本或MySQL:

假设您需要不区分大小写的模式匹配,因此为ILIKE

ANYALL构造是方便的功能,特别是对于较长的数组,但并非严格用于您的问题。 另外,并非严格需要WHERE子句,但通常可以提高性能。

细节:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM