2012-11-06 213 views
3

我有是有三個字段一個表:MySQL查詢生成報告

Id, Creation Time, Fuel Level 

每兩分鐘我們得到的數據並插入到database.For產生燃料的信用卡/借記聲明我想開始(說明當天)和結束(每日結束)Fuel Level.Can任何人都可以幫助形成查詢來生成此報告?

搜索參數將是日期範圍。

編號= 10;創建時間= 2019年2月15日16:32:59;燃油油位= 20

我創建這裏一個示例模式 http://sqlfiddle.com/#!2/76dd5

+0

舉個例子一些數據,它 –

+0

請嘗試自己的東西,並告訴我們當前的代碼,電流輸出和您的預期輸出..這將幫助我們找到解決方案 – Konza

回答

2

首先,對於提供燃料的變化爲每輛車每一天的查詢,你可以使用下面的SQL:

SELECT trip_range.dt 
    , trip_range.vehicle_id 
    , st.fuel_content as start_fuel_content 
    , en.fuel_content as end_fuel_content 
    , en.fuel_content - st.fuel_content as fuel_change 
    FROM (
SELECT tp.vehicle_id, DATE(tp.creation_time) dt 
    , MIN(tp.creation_time) start_time 
    , MAX(tp.creation_time) end_time 
    FROM trip_parameters tp 
GROUP BY tp.vehicle_id, DATE(tp.creation_time) 
) as trip_range 
    JOIN trip_parameters st 
    ON st.vehicle_id = trip_range.vehicle_id 
     AND st.creation_time = trip_range.start_time 
    JOIN trip_parameters en 
    ON en.vehicle_id = trip_range.vehicle_id 
     AND en.creation_time = trip_range.end_time 
WHERE trip_range.dt BETWEEN '2012-11-08' AND '2012-11-09' 

如果你想在燃料在所有的車輛每天的累計變動額在範圍內,以下SQL應該工作:

SELECT dt, SUM(fuel_change) as fuel_change 
    FROM (
SELECT trip_range.dt 
    , en.fuel_content - st.fuel_content as fuel_change 
    FROM (
SELECT tp.vehicle_id, DATE(tp.creation_time) dt 
    , MIN(tp.creation_time) start_time 
    , MAX(tp.creation_time) end_time 
    FROM trip_parameters tp 
GROUP BY tp.vehicle_id, DATE(tp.creation_time) 
) as trip_range 
    JOIN trip_parameters st 
    ON st.vehicle_id = trip_range.vehicle_id 
     AND st.creation_time = trip_range.start_time 
    JOIN trip_parameters en 
    ON en.vehicle_id = trip_range.vehicle_id 
     AND en.creation_time = trip_range.end_time 
WHERE trip_range.dt BETWEEN '2012-11-08' AND '2012-11-09' 
) change_by_vehicle 
GROUP BY 1 

希望這有助於!

約翰。

+0

John ....我會測試它... – vmb

+0

@John ...它工作不正常 – vmb

+0

請提供更多信息,例如表架構,示例行和示例輸出。或者,請轉至http://sqlfiddle.com/並使用一些示例數據創建表格。然後發佈我們的結果URL以「擺弄」。 –

1

嘗試以下:

SELECT Id, CreationTime, FuelLevel 
    FROM MYTABLE 
    WHERE DATE(CreationTime) = CURDATE(); 

這得到CreationTime的日期部分,並與當前日期進行比較,從而返回今天創建的所有記錄。

1

下面是返回輸出的查詢:

DATE   FUEL_CONTENT_AT_START_OF_DAY FUEL_CONTENT_AT_END_OF_DAY 
Nov, 08 2012 4.6        3.6 
Nov, 09 2012 11.6       5.6 

查詢

SELECT 
    DATE(startofday.creation_time) AS date, 
    startofday.fuel_content AS fuel_content_at_start_of_day, 
    (SELECT fuel_content FROM trip_parameters WHERE trip_paramid = max(endofday.trip_paramid)) AS fuel_content_at_end_of_day 
FROM 
    trip_parameters startofday 
    INNER JOIN trip_parameters endofday ON (DATE(endofday.creation_time) = DATE(startofday.creation_time)) 
WHERE 
    DATE(startofday.creation_time) BETWEEN '2012-11-08' AND '2012-11-09' 
GROUP BY 
    startofday.TRIP_PARAMID 
HAVING 
    min(endofday.trip_paramid) = startofday.trip_paramid 

我有更新SQLFiddle一樣,http://sqlfiddle.com/#!2/76dd5/67

該查詢的作用是

  • 獲取一行
    • 獲取當天所有相應的行
    • 獲取當天的最低和最高ID
  • 如果當前行ID從等於最小標識在JOIN顯示它,否則忽略
    • 使用的最大ID在一個子查詢來獲取一天fuel_content結束

希望這有助於

+0

是可以使用HQL查詢 – vmb

+0

會更好地激發複雜的查詢做同樣的事情直接使用RAW SQL。使用ORM來處理這些事情會讓它變得越來越難以理解 – Akash