30/09/2018, 16:08

Lấy giá trị lớn nhất trong bảng trong một chu kì thời gian xác định

Mình có đoạn truy vấn sau:

SELECT from_unixtime(F.timestamp), F.fuelLevel
FROM `gtse`.`tblFuel` F
JOIN
       (SELECT from_unixtime(timestamp) date_and_hour, MAX(fuelLevel) max_fuel
        FROM   gtse.tblFuel
        GROUP BY date_and_hour) AS max_fuel
        ON from_unixtime(F.timestamp) = max_fuel.date_and_hour 
        AND F.fuelLevel = max_fuel
where accountID = 'vinhnghia' and deviceID = '14C-00263'
and from_unixtime(timestamp) between '2014-10-20 00:00:02' and '2014-10-22 10:52:02'

mục đích của mình là lấy ra thời gian và mức nhiên liệu trong database. Nhưng do một số lý do ngoại cảnh mà dữ liệu không chuẩn, do đó mình muốn cứ sau khoảng 1 giờ thì sẽ lấy số liệu một lần ứng với giá trị lớn nhất trong khoảng đó. Code trên của mình làm việc đó, nhưng chắc do một số sai sót nào đó(mình đã kiểm tra và thực tình k xác định được lỗi ở đâu) mà query không chạy được. Mình muốn hỏi là có cách nào khác để lấy được giá trị theo yêu cầu không, và query của mình có sai sót gì không?

Phạm Hoàng Tuấn viết 18:23 ngày 30/09/2018

mình ngĩ bạn nên đưa csdl lên đây luôn, nếu có dữ kiệu test nữa thì càng tốt.

viết 18:12 ngày 30/09/2018

oops, cơ sở dữ liệu mình cũng k có, phải chạy trên server bạn ạ, mấy triệu bản ghi lận . Trước mình thử như này:

create table tblFuel (time timestamp, fuel int);

insert into tblFuel values ('2014-11-04 17:11:08', 231);
insert into tblFuel values ('2014-11-04 17:34:16', 254);
insert into tblFuel values ('2014-11-04 18:03:48', 241);
insert into tblFuel values ('2014-11-04 18:41:34', 137);
insert into tblFuel values ('2014-11-04 18:43:42', 111);

select
   *
from tblFuel
where concat(date(time), hour(time), fuel) in
    (select
       concat(date(time), hour(time), max(fuel))
     from tblFuel
     group by
        date(time),
        hour(time))

thì được kết quả như này:

time                 fuel
2014-11-04 17:34:16  254
2014-11-04 18:03:48  241

đúng cái mình cần, nhưng do mình dùng với table của mình thì không chạy nên mới phải dùng cách trên

Phạm Hoàng Tuấn viết 18:21 ngày 30/09/2018

mình có ý này, sao bạn k join 24 bảng lại (tương ứng vs 24 giờ trong ngày). Cách này dài nhưng mình ngĩ đơn giản nhất.Hoặc bạn có thể dùng store hoặc cusor. Mình k mở SQL nên viết code chay, chủ yếu nêu ý tưởng.

    select timestamp, max(fuel) as max, 
    from tblFuel
    where timestamp between '2014-10-20 00:00:01' and '2014-10-22 01:00:00'
    
    join
    
    select timestamp, max(fuel) as max, 
    from tblFuel
    where timestamp between '2014-10-20 01:00:01' and '2014-10-22 02:00:00'
    
    ...................

Bài liên quan
0