查询用于创建分组、聚合和过滤的行集的不同计数

Posted

技术标签:

【中文标题】查询用于创建分组、聚合和过滤的行集的不同计数【英文标题】:Querying for the distinct count used to create a grouped, aggregated, and filtered row set 【发布时间】:2018-06-06 22:26:24 【问题描述】:

我有一张如下所示的表格:

control=# select * from animals;
 age_range | weight | species
-----------+--------+---------
 0-9       |      1 | lion
 0-9       |      2 | lion
 10-19     |      2 | tiger
 10-19     |      3 | horse
 20-29     |      2 | tiger
 20-29     |      2 | zebra

我执行了一个汇总年龄范围内动物重量的查询,我只想返回具有上述聚合重量的行 一定数量。

汇总查询:

SELECT
 age_range,
 SUM(animals.weight) AS weight,
 COUNT(DISTINCT animals.species) AS distinct_species
FROM animals
GROUP BY age_range
HAVING SUM(animals.weight) > 3;

总结结果:

 age_range | weight | distinct_species
-----------+--------+------------------
 10-19     |      5 |                2
 20-29     |      4 |                2

现在问题来了。除此摘要外,我还想报告用于创建上述摘要行集的物种的不同数量作为一个整体。为简单起见,让我们将此数字称为“独特物种总数”。在这个简单的例子中,由于只使用了 3 个物种(老虎、斑马、马)来生成此摘要的 2 行,而不是“狮子”,因此“独特物种总数”应该是 3。但我不知道如何成功查询该号码。由于摘要查询必须使用 have 子句才能将过滤器应用于已分组和聚合的行集,因此在尝试查询“不同物种总计”时会出现问题。

这会返回错误的数字 2,因为它错误地是非重复计数的非重复计数:

SELECT
 COUNT(DISTINCT distinct_species) AS distinct_species_total
FROM (
 SELECT
  age_range,
  SUM(animals.weight) AS weight,
  COUNT(DISTINCT animals.species) AS distinct_species
 FROM animals
 GROUP BY age_range
 HAVING SUM(animals.weight) > 3
) x;

当然这会返回错误的数字 4,因为它没有考虑使用 having 子句过滤分组和聚合的摘要结果:

SELECT
 COUNT(DISTINCT species) AS distinct_species_total
FROM animals;

感谢任何帮助我走上正确道路的帮助,并希望能帮助其他有类似问题的人,但最终我确实需要一个适用于 Amazon Redshift 的解决方案。

【问题讨论】:

【参考方案1】:

将结果集与原始动物表相结合并计算不同的物种。

select distinct x.age_range,x.weight,count(distinct y.species) as distinct_species_total
from 
(
     select age_range,sum(animals.weight) as weight
     from animals
     group by age_range
     having sum(animals.weight) > 3
) x
join animals y on x.age_range=y.age_range

【讨论】:

不错,干净的解决方案。实际上,我的“动物”表是由多个表连接产生的派生表,但您的解决方案也适用于此。

以上是关于查询用于创建分组、聚合和过滤的行集的不同计数的主要内容,如果未能解决你的问题,请参考以下文章

十MySQL 聚合函数分组查询及过滤分组

十MySQL 聚合函数分组查询及过滤分组

mysql查询数据

MySQL-查询

如何使用过滤器从scala中的数据框中获取包含空值的行集

基础-SQL-DQL-分组查询