2

私は1つのテーブルを持っていますtrip_data.1秒ごとにパケットを取得し、データベースにデータを挿入しています. trip_dataテーブルには4つ含まれfields.trip_paramid,fuel_content,creation_time&vehicle_idています。作成時間の差が2分(正確には2ではありません。約2)のすべての行を選択したいです。trip_dataテーブルには 40 個の不足行が含まれています。したがって、これには最適化された選択クエリが必要です。これについて誰か助けてもらえますか。trip_table のテーブル スキーマとサンプル データは次のとおりです。

SQLFiddle のデモ

4

3 に答える 3

1
SELECT 
    tp.*
FROM 
    trip_parameters tp
GROUP BY 
    CONVERT(UNIX_TIMESTAMP (tp.creation_time)/(2*60), unsigned)
ORDER BY
    tp.creation_time asc

UNIX_TIMESTAMP を使用すると、2037 年を超える日付を処理できないことに注意してください。代わりに以下を使用すると、問題が解決します。

CONVERT(TIMESTAMPDIFF(SECOND,'1970-01-01 00:00:00',tp.creation_time)/(2*60), unsigned)
于 2012-11-30T07:13:03.547 に答える
0

MYSQL User defined variablesを使用して、1 つのテーブル スキャンで実行できます。残念ながら、UDV のデータ型のセットは限られています (整数、10 進数、浮動小数点、バイナリ、または非バイナリ文字列)。したがって、このクエリでは、char 変数を使用し@tiて、CAST を使用して以前の日時を格納し、それをCreation_timeフィールドと比較します。また、この変数の初期値を (now()-10000000) に設定しました。MIN(Creation_time) 未満の任意の日付を使用できます。

これがSQLFiddleのデモです

select * from
(
select trip_parameters.*, 
if(ABS(TIMESTAMPDIFF(MINUTE,Creation_time,cast(@ti as datetime)))>=2,1,0) t,
@ti:=if(ABS(TIMESTAMPDIFF(MINUTE,Creation_time,cast(@ti as datetime)))>=2,
                             cast(Creation_time as char(100)),@ti)
from trip_parameters,
     (select @ti:=cast(now()-10000000 as char(100))) a
order by creation_time
) t2
where T=1
order by creation_time
于 2012-11-30T07:47:26.580 に答える
-1

これを試して

SELECT trip_paramid, fuel_content, creation_time, vehicle_id
FROM trip_parameters
GROUP BY FLOOR(UNIX_TIMESTAMP(creation_time)/120)

これには、2 分のブロックごとに 1 つのアイテムが必要です

于 2012-11-30T07:12:51.127 に答える