【问题标题】:Impala Analytical functions in where clause在 where 子句中的 Impala 分析函数
【发布时间】:2017-03-06 08:52:40
【问题描述】:

所以问题的基本前提是我在 hadoop 中有一些巨大的表,我需要从每个月获取一些样本。我已经模拟了下面的内容以显示我所追求的那种东西,但显然它不是真实的数据......

--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 子句不能包含解析表达式

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 子句从中进行选择更好的方法?

【问题讨论】:

    标签: sql hadoop rank impala analytical


    【解决方案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;
    

    【讨论】:

    • 谢谢,是的,这行得通。我想我可能是想多了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-25
    • 2010-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多