2012-04-17 6 views
0

以下のサンプルデータを与えて、timeの1分ごとに1行だけを取得できますか?mutilple条件を持つ時間ごとのMysqlグループ

私は、このような状態を作る必要があります。

SELECT IF (`Flag` IS NOT NULL, 
      [fetch flag row], 
      [otherwise fetch one row from that minute]); 

サンプル・データ

ID Rate Flag  time 
1 68.65 null  2012-04-18 10.00.01 
2 68.63 null  2012-04-18 10.00.11 
3 68.68 null  2012-04-18 10.00.21 
4 68.70 null  2012-04-18 10.00.31 
5 68.71 null  2012-04-18 10.00.41 
6 68.60 null  2012-04-18 10.00.51 
7 68.64 null  2012-04-18 10.01.01 
8 68.75 null  2012-04-18 10.01.11 
9 68.72 1   2012-04-18 10.01.21 
10 68.63 null  2012-04-18 10.01.31 
11 68.62 null  2012-04-18 10.01.41 
12 68.60 null  2012-04-18 10.01.51 

Expected Output 
1 68.65 null  2012-04-18 10.00.01 
9 68.72 1   2012-04-18 10.01.21 

これは私がこれまで持っているものである:あなたのための

SELECT FLAG as signal, DATE_FORMAT(TIME, '%Y-%m-%d %H:%i') as time, RATE as rate 
     FROM RATES WHERE (FLAG!='' || (DATE_FORMAT(TIME, '%s')>50)) 
    GROUP BY time 
    ORDER BY time DESC,FLAG DESC; 

感謝を助けて。

ニキル

+0

SELECT信号としてFLAG、DATE_FORMAT:時間として(TIME、 '%Y-%M-%D%H%I')、料金FROM WHERE(FLAG率としてRATEこれは問題ありませんが、私のテーブルには巨大なレコードがありますが、このクエリは長い実行時間を要します(例:DATE_FORMAT(TIME、 '%s')> 50))GROUP BY時間ORDER BY時間DESC、FLAG DESC – user1340004

答えて

0

あなたの問題は、のように記述することができる:複数の行が同じフラグを有する場合、いずれかを選択し、同じ分単位でグループ化された行のすべてのセットで最大のフラグを持つ行を見つけます。 だから、クエリは次のようになります。

SELECT r.id, r.rate, rg.flag, rg.minute 
FROM 
    (SELECT MAX(flag) as flag , DATE_FORMAT(`TIME`, '%Y-%m-%d %H:%i') as minute 
    FROM RATES 
    GROUP BY minute) rg 
JOIN RATES r 
ON r.id =(SELECT ru.id FROM RATES ru 
      WHERE ru.flag <=> rg.flag 
      AND ru.time BETWEEN CONCAT(rg.minute,':00') AND CONCAT(rg.minute,':59') 
      LIMIT 1) 
+0

。 – user1340004

+0

テーブルからの列ではなく派生した値をグループ化するため、大きなテーブルでは遅くなるため、インデックスをグループ化することはできません。完全な時間に近似した日時の列を追加し、グループ化や結合に使用してみると、索引ではるかに高速になります。しかし、本当に巨大なテーブルでは、1分ごとに1行にフラグを立てるのが最善です。あなたは今、どれくらい正確にそれらにフラグを立てていますか?手動でフラグを追加しますか? – piotrm

+0

テーブルは5秒ごとに行を更新していますが、フラグを手動で設定していません。フラグは頻繁ではなく、1時間に1,2回発生する可能性があります。 – user1340004

関連する問題