在 Impala 中查找百分比作为子查询

Posted

技术标签:

【中文标题】在 Impala 中查找百分比作为子查询【英文标题】:Finding percentage as a subquery in Impala 【发布时间】:2020-04-24 17:52:30 【问题描述】:

我正在尝试使用两个单独的子查询的结果来查找百分比。 两个查询都使用同一列的计数,一个使用 where 子句,一个使用整个集合。

第一个查询:

SELECT COUNT(DISTINCT(col1))
FROM table
WHERE LOWER(col2) NOT IN ("value1", "value2")

第二次查询:

SELECT COUNT(DISTINCT(col1))
FROM table

我需要以下结果:

(first query)/(second query) *100

作为百分比,但我不确定如何执行此操作,因为 Impala 不允许在 select 语句中使用子查询。

【问题讨论】:

你为什么用mysql标记你的问题? 【参考方案1】:

除非您使用的是最新版本之一(3.1.0 或更高版本),否则 Impala 不支持在一个语句中使用多个 count(distinct)s,请参阅 IMPALA-110。

也许您可以使用 CTE 将查询拆分为多个语句。例如:

WITH q1 AS 
  SELECT COUNT(DISTINCT(col1)) count1
  FROM table
  WHERE LOWER(col2) NOT IN ("value1", "value2")
),
q2 AS (
  SELECT COUNT(DISTINCT(col1)) count2
  FROM table
)
SELECT 100 * q1.count1 / q2.count2  result
FROM q1, q2

【讨论】:

【参考方案2】:

使用条件聚合:

SELECT 
  100.0 * COUNT(DISTINCT CASE WHEN LOWER(col2) NOT IN ("value1", "value2") THEN col1 END) / COUNT(DISTINCT col1)
FROM table

或:

SELECT 100.0 * COUNT(DISTINCT col1) / (SELECT COUNT(DISTINCT col1) FROM table)
FROM table
WHERE LOWER(col2) NOT IN ("value1", "value2")

【讨论】:

这似乎最有效。但是,第一个“Distinct”会引发错误(如果我将其取出并保留在第二个 distinct 中,它会起作用)。关于如何使第一部分只计数不同的任何想法? 如您在此处看到的:db-fiddle.com/f/tS283ypZ5FyPZiZAHV4ogs/0 没有语法错误。 我认为不是在第一部分使用 distinct,而是需要按“col1”分组。您知道是否可以在此语句中使用 group by ?谢谢! Group by 与您在问题中描述的要求无关。 查看我的第二个查询的另一个选项。

以上是关于在 Impala 中查找百分比作为子查询的主要内容,如果未能解决你的问题,请参考以下文章

Impala - 从一张表计算百分比

Impala 中 SELECT 语句的算术运算

BigQuery Legacy SQL(子查询?)中占总数的百分比

SQL查询查找组长的出勤率应该大于avg。出席率 占HIS组所有成员的百分比

mysql 将子查询排除在连接之外

Sql查询以查找两个给定日期之间的视图百分比差异