我有一个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'
此查询已执行但输出不是单个最新订单阶段,而是每个订单阶段的相应最新时间戳。
请帮忙。
答案 0 :(得分:1)
对于给定的订单,您需要一行。因此,您可以使用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;
这也应该具有最佳性能。
答案 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”的值,您将轻松获得所需的结果。
一切顺利!