HIVE SQL:每个user_id的最后三个日期的平均值

时间:2014-02-06 23:55:15

标签: sql subquery hive aggregate-functions

我有一个有三列的表。 'user_id','日期','数字'。这是一个示例表:

user_id    date          number
a          2000-01-01    100
a          2003-03-08    50
a          2004-04-21    10
a          2004-12-11    10
a          2010-03-03    10
b          2000-06-29    1
b          2002-05-22    2
b          2002-07-06    3
b          2008-10-20    4

我想要返回的是'user_id'的唯一列表,以及每个用户仅在最近三个日期的'数字'的平均值。

所以我想看看user_id:a,avg:AVG(10,10,10)= 10和user_id:b,avg:AVG(2,3,4)= 3。以表格形式:

user_id    avg_3
a          10
b          3

我对如何在HIVE SQL中执行此操作感到茫然。到目前为止,我只有一个平均HIVE查询:

SELECT user_id, AVG(number) FROM table_name
GROUP BY user_id

---- ---- EDIT

查看此链接后:extract top n records in each group.。我想出了以下可能性,但是Hive不喜欢它(错误:无效的功能'等级')。

SELECT b.user_id, avg(b.number)
FROM
(
   SELECT a.user_id, a.number, a.date, rank(a.user_id) as r
   FROM (
        SELECT user_id, date, number
        FROM table_name
        DISTRIBUTE BY user_id
        SORT BY user_id, number desc
        ) a
) b
WHERE a.r < 5
GROUP BY b.user_id

-----编辑#2 -----

我刚刚意识到'rank'函数是Hive中的用户定义函数。因此,Hive不承认它。如果没有UDF,有没有人知道这个方法呢?

1 个答案:

答案 0 :(得分:2)

使用Hive 11+,它引入了窗口函数。

SELECT b.user_id, avg(b.number)
FROM
(
   SELECT user_id, number, date,
          row_number() over (partition by user_id order by date desc) r
   FROM table_name
) b
WHERE r <= 3
GROUP BY b.user_id