我有一个类似于以下表格
UserId | ActionType
--------------------
1 | Create
2 | Read
1 | Edit
2 | Create
3 | Read
我想找到用户执行的“最高”操作,并具有以下层次结构Create > Edit > Read
。运行所需的查询应返回
UserId | ActionType
-------------------
1 | Create
2 | Create
3 | Read
是否有办法在HIVE中利用MAX()
来做到这一点?我的结构看起来像以下非常基本的查询,但是我不确定如何计算上面的ActionType列。
SELECT UserId, ??? FROM UserActions GROUP BY UserId;
我认为可能的解决方案是在CASE
中使用GROUP BY
语句,或者将值转换为数字值,例如(Read => 0, Edit => 1, Create => 2)
,然后执行GROUP BY
,但是我希望有一个更优雅的解决方案。
谢谢!
答案 0 :(得分:0)
我不知道 hiveql 是否支持子查询,但这就是如果它在SQL上的想法:
SELECT
a.UserId,
a.ActionType
From
a.UserActions
WHERE
a.ActionType = (
SELECT
b.ActionType
From
(
SELECT
MAX(COUNT(*)),
c.ActionType
FROM
UserActions as c
WHERE
c.UserId = a.UserId
GROUP BY
c.ActionType
) as b
)
答案 1 :(得分:0)
下面将是在蜂巢中的查询。
select
t1.userId, t1.actionType,
min(case when t1.actionType='Create' then 1 else 100
when t1.actionType='Edit' then 2 else 100
when t1.actionType='Read' then 3 else 100 end) as GroupBy
from mytable t1 group by t1.userId, t1.actionType