2017-03-06 2 views
1

질문의 기본 전제는 각 달마다 샘플을 얻으려는 대형 테이블이 있습니다. 나는 난 후 물건의 종류를 표시하기 위해 아래의 조롱했지만 분명히 그것은임팔라 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')); 

내가 얻고 싶은 것은 각 치즈 카테고리의 막내 이명 같은 것입니다 ... 실제 데이터 아니다. 아래는 나에게 각 치즈 범주에 대한 연령 순위를 제공하지만, 상위 두에 제한되지 않습니다

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

감사합니다. 나는 아마 그것을 생각하고 있었다고 생각한다! –