[英]How to filter in the where clause, on a column that is within the select statement and contains count/distinct/case/when
在hadoop上使用SQL。
我有一个ID列表,在此我要计算2种类型的不同来宾评论数据点的总数。 对于guest_review_1
我已返回总计。 对于guest_review_2
我将总数分为5个范围。
我正在努力的是在guest_review_1
的where子句中设置一个过滤器,其中我不包括总计数小于5的属性。
有任何解决方法的想法吗? 嵌套的Select语句可能吗?
包括以下查询示例:
Select
id,
count(distinct guest_review_1) as "Guest_Reviews",
count(distinct(case when guest_review_2 < 1 then guest_review_1 end)) as Group1,
Count(distinct(case when guest_review_2 >=2 AND guest_review_2 <3 then guest_review_1 end)) as Group2,
From table_name
Where
guest_review_2 IS NOT NULL
AND guest_review_1 >=5
AND date BETWEEN '2017-01-01' AND '2017-01-31'
Group By id
我group_2
您的示例查询中的group_1
和group_2
聚合的含义。 但是,您的问题的实质似乎是关于如何基于聚合函数( count
)的结果过滤结果集,而不是根据单个输入行的值进行过滤。 Apache Hive通过使用SQL HAVING
子句来支持这一点。
在下面的例子中,输入关系包含6个行与id
设置为1
和4行与id
设置为2
。 该查询包含子句HAVING guest_reviews >= 5
。 由于存在HAVING
子句,结果集仅包含id
为1
的行。 没有将id
设置为2
输出行。
WITH table_name AS (
SELECT 1 AS id, 1 AS guest_review_1, 1 AS guest_review_2 UNION ALL
SELECT 1 AS id, 2 AS guest_review_1, 2 AS guest_review_2 UNION ALL
SELECT 1 AS id, 3 AS guest_review_1, 3 AS guest_review_2 UNION ALL
SELECT 1 AS id, 4 AS guest_review_1, 4 AS guest_review_2 UNION ALL
SELECT 1 AS id, 5 AS guest_review_1, 5 AS guest_review_2 UNION ALL
SELECT 1 AS id, 6 AS guest_review_1, 6 AS guest_review_2 UNION ALL
SELECT 2 AS id, 1 AS guest_review_1, 1 AS guest_review_2 UNION ALL
SELECT 2 AS id, 2 AS guest_review_1, 2 AS guest_review_2 UNION ALL
SELECT 2 AS id, 3 AS guest_review_1, 3 AS guest_review_2 UNION ALL
SELECT 2 AS id, 4 AS guest_review_1, 4 AS guest_review_2
)
SELECT
id,
count(DISTINCT guest_review_1) AS guest_reviews,
count(DISTINCT(CASE WHEN guest_review_2 < 1 THEN guest_review_1 END)) AS group_1,
count(DISTINCT(CASE WHEN guest_review_2 >= 2 AND guest_review_2 < 3 THEN guest_review_1 END)) as group_2
FROM table_name
WHERE guest_review_2 IS NOT NULL
GROUP BY id
HAVING guest_reviews >= 5
;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.