带有非数字列的GROUP BY中的MAX()使用情况

时间:2019-02-21 23:33:58

标签: hiveql

我有一个类似于以下表格

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,但是我希望有一个更优雅的解决方案。

谢谢!

2 个答案:

答案 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