2012-11-06 214 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