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