我有一个有三列的表。 '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,有没有人知道这个方法呢?
答案 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