我在hive上有一个表A,如下所示:
id msts action
123 1000 sleep
123 1010 eat
123 2001 sleep
456 1200 eat
456 1500 drink
我想要的是为每个id
选择与min(tmst)
对应的整个集合。我可以通过运行
select *
from A t1 semi
left join
(select id, min(msts) as msts from A group by id)
t2 on t1.id = t2.id and t1.msts = t2.msts;
但是我想知道如果没有连接(或自定义缩减器)我是否可以这样做,因为它很耗时。
编辑:澄清:我想要实现的目标是id
所做的第一个操作(与action
对应的min(msts)
)。
答案 0 :(得分:3)
在Hive社区中有一些关于是否实现argmin和argmax udfs的问题,这正是你想要的。解决方案不是添加它,因为有结构的解决方法。诀窍是结构首先通过第一个字段进行比较,因此您可以首先将字段转换为带有比较字段的结构,执行最小值,然后将字段取消结构化。在这种情况下:
select s.id as id, s.msts as msts, s.action as action from (
select min(named_struct('msts', msts, 'id', id, 'action', action)) as s
from A group by id
) t;
答案 1 :(得分:0)
如果您需要显示操作字段,则无法在不加入的情况下执行此操作。 如果您不需要操作字段,请尝试以下操作:
select id, min(msts) as msts
from A group by id;