拾取minValue及其在蜂巢中的行

问题描述 投票:0回答:1

我必须在2小时的滑动日期窗口及其相应的日期值中选择minValue。例如

Create table stock(time string, cost float);

Insert into stock values("1990-01-01 8:00 AM",4.5);
Insert into stock values("1990-01-01 9:00 AM",3.2);
Insert into stock values("1990-01-01 10:00 AM",3.1);
Insert into stock values("1990-01-01 11:00 AM",5.5);
Insert into stock values("1990-01-02 8:00 AM",5.1);
Insert into stock values("1990-01-02 9:00 AM",2.2);
Insert into stock values("1990-01-02 10:00 AM",1.5);
Insert into stock values("1990-01-02 11:00 AM",6.5);
Insert into stock values("1990-01-03 8:00 AM",8.1);
Insert into stock values("1990-01-03 9:00 AM",3.2);
Insert into stock values("1990-01-03 10:00 AM",2.5);
Insert into stock values("1990-01-03 11:00 AM",4.5);

为此,我可以编写这样的查询

select min(cost) over(order by unix_timestamp(time) range between current row and 7200 following)
from stock

因此,从当前行向前看2小时(7200秒),然后选择最小值第一行的最小值为3.1,位于上午10:00的第三行。我可以通过此查询获得正确的最小值,但是对于最小值,我还需要相应的日期值,在这种情况下,我需要“ 1990-01-01 10:00 AM”。我该如何挑选?

谢谢,拉吉

sql hive bigdata hiveql
1个回答
0
投票

我认为这是一个难题。一种方法是join查找值:

select s.*
from (select s.*,
             min(cost) over (order by unix_timestamp(time) range between current row and 7200 following) as min_cost,
      from stock s
     ) s join
     stock smin
     on smin.cost = min_cost and
        unix_timestamp(smin.time) >= unix_timestamp(s.time) and
        unix_timestamp(smin.time) < unix_timestamp(s.time) + 7200

这种方法的缺点是可能会产生重复。如果这是一个问题:

select s.*
from (select s.*, smin.time as min_time,
             row_number() over (partition by s.time order by smin.time) as seqnum
      from (select s.*,
                   min(cost) over (order by unix_timestamp(time) range between current row and 7200 following) as min_cost,
            from stock s
           ) s join
           stock smin
           on smin.cost = min_cost and
              unix_timestamp(smin.time) >= unix_timestamp(s.time) and
              unix_timestamp(smin.time) < unix_timestamp(s.time) + 7200
       ) s
where seqnum = 1;
© www.soinside.com 2019 - 2024. All rights reserved.