Lấy giá trị lớn nhất theo chu kì trong toàn bộ bảng
Mình có query lấy giá trị lớn nhất trong vòng một giờ(theo chu kì) của một thiết bị cụ thể như sau:
SELECT from_unixtime(thoiGian), nhienLieu
FROM `gtse`.`tblDoXang`
where concat(date(from_unixtime(thoiGian)), hour(from_unixtime(thoiGian)), nhienLieu) in
(select
concat(date(from_unixtime(thoiGian)), hour(from_unixtime(thoiGian)), max(nhienLieu))
from gtse.tblDoXang
where accountID = 'vinhnghia'
and deviceID = '14C-00263'
and from_unixtime(thoiGian) between '2014-10-01 00:00:00' and '2014-11-18 23:59:59'
group by
date(from_unixtime(thoiGian)),
hour(from_unixtime(thoiGian)))
Giờ mình luốn select cả bảng để lấy tất cả các giá trị của các account và device khác nhau thoả mãn điều kiện là chỉ lấy giá trị lớn nhất của nhienLieu trong mỗi một giờ. Mình thử truy vấn này:
SELECT from_unixtime(thoiGian), nhienLieu
FROM `gtse`.`tblDoXang`
where concat(date(from_unixtime(thoiGian)), hour(from_unixtime(thoiGian)), nhienLieu) in
(select
concat(date(from_unixtime(thoiGian)), hour(from_unixtime(thoiGian)), max(nhienLieu))
from gtse.tblDoXang
group by
date(from_unixtime(thoiGian)),
hour(from_unixtime(thoiGian)))
Sau đó mình check lại thì thấy nó lấy thiếu một số giá trị max so với query mình thử với accountID và deviceID ở trên. Do trong bảng tblDoXang mình có rất nhiều account nên việc lấy thủ công như đoạn query trên(đầu tiên) là không thể. Vậy cho mình hỏi cách nào lấy cả bảng (thỏa mãn điều kiện max) không?
Bạn thử join 2 bảng lại (bảng kia BND là bảng chứa accountid,deviceid) xem.
Ví dụ:
Có vẻ như mình nói chưa rõ ý của mình thì phải, cả hai truy vấn trên của mình đều là lấy từ bảng tblDoXang. Chỉ khác là truy vấn đầu mình chỉ rõ ra accountID, deviceID và thoiGian còn truy vấn thứ hai mình muốn lấy cả bảng(cho tất cả các accountID và deviceID). Và cái truy vấn thứ hai lấy ra kết quả không như mong muốn.
Vậy mình ngĩ ra 2 hướng :
Hướng 1: BANGNAODO là bảng tblDoXang luôn cũng được mà, có nhất thiết fai là bảng khác đâu.
Hướng thứ 2 : Mình ngĩ câu của bạn có thể làm đơn giản như vậy được mà (ý tưởng thôi nhé, k biết đúng không, nếu muốn bạn có thể thử)
group by hour(thoigian)
là bạn gom nhóm theo giờ. Cú pháp lấy giờ bạn lên search lại cho chắc nhéBạn thử xem có được không.
Query của bạn chỉ được max của mỗi xe trong khoảng thời gian đó. Có nghĩa là ví dụ có 5 xe thì ra được 5 cái giá trị max. Trong khi trong khoảng thời gian đó, mỗi xe sẽ có khoảng trên dưới 10 cái giá trị max(theo mỗi một giờ).
ý bạn là mỗi xe sẽ có 1 giá trị max theo
accountID
vàdeviceID
, nếu vậy bạn gom nhóm thêmmã xe
vào nữa.Chính xác là query này. Thanks vì gợi ý của bạn.