从其他列有条件地从hive表中获取最新列值

时间:2018-05-17 07:58:59

标签: sql hive impala

我有一个Hive表' Orders'有四列(id String,name String,Order String,ts String)。表的样本数据如下。

-------------------------------------------
id  name    order               ts
------------------------------------------- 
1   abc     completed       2018-04-12 08:15:26     
2   def     received        2018-04-15 06:20:17
3   ghi     processed       2018-04-16 11:36:56
4   jkl     received        2018-04-05 12:23:34
3   ghi     received        2018-03-23 16:43:46
1   abc     processed       2018-03-17 18:39:22
1   abc     received        2018-02-25 20:07:56

订单栏收到三个州 - >已处理 - >完成。单个名称有很多订单,每个订单都有这三个阶段。我需要最新的订单价值才能获得给定的' id'并且' name'。这对你来说似乎是一个新手问题,但我坚持这个。

我尝试过编写类似下面的查询,但它们无法正常工作,我无法直接在' ts'上使用max函数。列,因为它是字符串格式。请建议一个最好的方法。 提前致谢。

我试过的查询

SELECT
ORDER
FROM Orders
WHERE id = '1'
    AND name = 'ghi'
    AND ts = (
        SELECT max(unix_timestamp(ts, 'yyyy-MM-dd HH:mm:SS'))
        FROM Orders
        )
  

编译语句时出错:FAILED:ParseException第2:0行无法识别'选择' '最大' '('在表达式规范中

SELECT
ORDER
FROM Orders
WHERE id = '1'
    AND name = 'ghi'
    AND max(unix_timestamp(ts, 'yyyy-MM-dd HH:mm:SS'))
  

编译语句时出错:FAILED:SemanticException [错误10128]:第1:93行还不支持UDAF' max'

select o.order  from Orders o
inner join ( 
    select id, name, order, max(ts) as ts
    from Orders
    group by id, name, order
) ord on d.id = ord.id and o.name = ord.name and o.ts = ord.ts where o.id = '1' and o.name = 'abc'

此查询已执行但输出不是单个最新订单阶段,而是每个订单阶段的相应最新时间戳。

请帮忙。

2 个答案:

答案 0 :(得分:1)

对于给定的订单,您需要一行。因此,您可以使用order bylimit

SELECT o.*
FROM Orders o
WHERE id = 1 AND  -- presumably id is a number
     name = 'ghi'
ORDER BY ts DESC
LIMIT 1;

这也应该具有最佳性能。

答案 1 :(得分:0)

您可以使用RANK分析功能解决问题,如下所示:

select id,name,order,ts
from (select id,name,order,ts,rank() over(partition by id,name order by ts) r from orders)k
where r = 1
and id = '1'
and name = 'ghi'

如果您想获取所有ID和名称的最新记录,那么您无需传递“ID”和“NAME”的值,您将轻松获得所需的结果。

一切顺利!