2017-03-06 9 views
1

質問の基本的な前提は、私​​が毎月いくつかのサンプルを取得する必要がある大きなハーフテーブルをハーフープに持っていることです。私は私が取得したいことは、各チーズカテゴリで最も若い2人のようなものであるImpalaの解析関数where節の解析関数

--Create the table 
CREATE TABLE exp_dqss_team.testranking (
    Name STRING, 
    Age INT, 
    Favourite_Cheese STRING 
) STORED AS PARQUET; 

--Put some data in 
INSERT INTO TABLE exp_dqss_team.testranking 
VALUES (
    ('Tim', 33, 'Cheddar'), 
    ('Martin', 49, 'Gorgonzola'), 
    ('Will', 39, 'Brie'), 
    ('Bob', 63, 'Cheddar'), 
    ('Bill', 35, 'Brie'), 
    ('Ben', 42, 'Gorgonzola'), 
    ('Duncan', 55, 'Brie'), 
    ('Dudley', 28, 'Cheddar'), 
    ('Edmund', 27, 'Brie'), 
    ('Baldrick', 29, 'Gorgonzola')); 

...私は後だが、明らかにそれが実際のデータではありません事の並べ替えを表示するには、以下を嘲笑しました。下記の私に、各チーズカテゴリの年齢のランキングを与えるが、上の2つに制限しません。

SELECT RANK() OVER(PARTITION BY favourite_cheese ORDER BY age asc) AS rank_my_cheese, favourite_cheese, name, age 
FROM exp_dqss_team.testranking; 

私はそれは私に次のエラーを与えるWHERE句を追加した場合:

WHERE clause must not contain analytic expressions

SELECT RANK() OVER(PARTITION BY favourite_cheese ORDER BY age asc) AS rank_my_cheese, favourite_cheese, name, age 
FROM exp_dqss_team.testranking 
WHERE RANK() OVER(PARTITION BY favourite_cheese ORDER BY age asc) <3; 

これを行うには、すべてのランキングのテーブルを作成してから、それをランク付けのWHERE節で選択するよりも良い方法はありますか?

答えて

1

これを試してもよろしいですか?

select * from (
SELECT RANK() OVER(PARTITION BY favourite_cheese ORDER BY age asc) AS rank_my_cheese, favourite_cheese, name, age 
FROM exp_dqss_team.testranking 
) as temp 
where rank_my_cheese <= 2; 
+0

ありがとうございます。私はおそらくそれを考えすぎたと思う! –