有条件地从配置单元表中获取其他列的最新列值

myss37ts  于 2021-06-26  发布在  Hive
关注(0)|答案(2)|浏览(306)

我有一个配置单元表'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

order列有三种状态received->processed->completed。一个名字有很多订单,每个订单都有这三个阶段。我需要给定“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
        )

编译语句时出错:失败:parseexception行2:0无法识别表达式规范中“select”“max”()附近的输入

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

编译语句时出错:失败:semanticexception[error 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'

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

r6hnlfcb

r6hnlfcb1#

您可以使用秩分析函数来解决问题,如下所示:

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和name的最新记录,那么您不需要传递“id”和“name”的值,您将很容易得到您想要的结果。
祝你一切顺利!!!

k4emjkb1

k4emjkb12#

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

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

这也应该有最好的表现。

相关问题