2017-07-13 1 views
1

hadoopでSQLを使用する。where文節にフィルタをかける方法、select文の中にあり、count/distinct/case/whenを含むカラムの場合

2種類のゲストレビューデータポイントの合計数をカウントしようとしているIDのリストがあります。 guest_review_1については、合計を返しました。 guest_review_2については、合計数を5つの範囲に分割しました。私は苦労しています何

は、私が回避策の5未満

任意のアイデアの合計数を持っていたプロパティが含まいけないことでguest_review_1のwhere句にフィルタを設定するのですか?ネストされた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 

答えて

0

私はあなたのサンプルクエリでgroup_1group_2凝集体の意味を完全に一定ではありませんよ。しかし、あなたの質問の本質は、個々の入力行の値をフィルタリングするのではなく、集計関数(count)の結果に基づいて結果セットをフィルタリングする方法にあるようです。 Apache Hiveは、SQL HAVING節を使用してこれをサポートしています。次の例で

、入力関係が2からidセットと1と4行にidセットと6行を含みます。クエリには、HAVING guest_reviews >= 5という句が含まれています。 HAVING句のため、結果セットにはidの行と1の行のみが含まれます。 id2に設定された出力行はありません。

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 
; 
関連する問題