【问题标题】:How to return multiple aggregates from a single query, all with different constraints?如何从单个查询返回多个聚合,所有聚合都具有不同的约束?
【发布时间】:2016-02-26 00:13:47
【问题描述】:

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

如何计算包含“crackers”一词的交易数量、包含“soda”的交易数量以及同时包含“crackers”和“soda”的交易数量.

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

【问题讨论】:

  • 您可以执行三个聚合查询,然后将它们合并,从而每个子查询获得一行。或者您可以在列列表中使用子查询,并以一行结束,每列包含一个子查询计数(sgeddes 有这种答案)。
  • Ricky,您实际使用的是哪个数据库系统?这里有两个数据库标签。

标签: mysql sql postgresql aggregate


【解决方案1】:

您可以为此使用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

【讨论】:

    【解决方案2】:

    Postgres 9.4 或更高版本中,使用专用的aggregate FILTER clause

    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 子句并不是绝对需要的,但通常可以提高性能。

    详情:

    【讨论】:

      猜你喜欢
      • 2010-09-14
      • 1970-01-01
      • 1970-01-01
      • 2022-09-23
      • 2018-12-17
      • 1970-01-01
      • 1970-01-01
      • 2015-10-15
      • 2014-05-12
      相关资源
      最近更新 更多