我有一个配置单元表'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'
已执行此查询,但输出不是单个最新订单阶段,而是具有相应最新时间戳的每个订单阶段。
请帮忙。
2条答案
按热度按时间r6hnlfcb1#
您可以使用秩分析函数来解决问题,如下所示:
如果您想要获得所有id和name的最新记录,那么您不需要传递“id”和“name”的值,您将很容易得到您想要的结果。
祝你一切顺利!!!
k4emjkb12#
对于给定的订单,您需要一行。因此,您可以使用
order by
以及limit
:这也应该有最好的表现。