3

3つのフィールドを持つ1つのテーブルがあります。

Id, Creation Time, Fuel Level

2分ごとにデータを取得してデータベースに挿入しています。燃料のクレジット/デビットステートメントを生成するために、開始(その日の統計)と終了(その日の終わり)の燃料レベルを取得したいと思います。このレポートを生成しますか?

検索パラメータは日付範囲になります。

Id=10;作成時間=2019-02-1516:32:59;燃料レベル=20

ここで1つのサンプルスキーマを作成しました http://sqlfiddle.com/#!2/76dd5

4

3 に答える 3

4

まず、毎日の各車両の燃料の変化を提供するクエリに対して、次の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

お役に立てれば!

ジョン..。

于 2012-11-06T04:49:33.890 に答える
1

以下をお試しください:

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

これにより、の日付部分が取得され、CreationTime現在の日付と比較されるため、今日作成されたすべてのレコードが返されます。

于 2012-11-06T04:30:52.663 に答える
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を取得します
  • 現在の行IDがJOIN表示からの最小IDと等しい場合、それ以外の場合は無視します
    • サブクエリで最大IDを使用して、1日の終わりのfuel_contentを取得します

お役に立てれば

于 2013-02-10T06:06:53.697 に答える