2012-04-17 90 views
0

給出下面的示例數據,如何獲取time的每分鐘只有一行?Mysql Group by time by mutilple condition

然後我需要做這樣的條件:

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-%間 - %d%H:%I')隨着時間,速率速率FROM價格WHERE(FLAG !=''||(DATE_FORMAT(TIME,'%s')> 50))GROUP BY time ORDER BY time DESC,FLAG DESC – user1340004 2012-04-18 00:00:13

回答

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 2012-04-18 03:10:17

+0

由於在某些派生值上進行分組而不是從表中的列進行分組,因此在一張大桌子上肯定會很慢,因此無法使用索引進行分組。你可以嘗試添加一個日期時間列,其時間接近完整分鐘,並將其用於分組和連接,使用索引會快很多。但是在一張非常大的桌子上,最好每分鐘標記一行。你現在怎麼標記他們?你手動添加標誌嗎? – piotrm 2012-04-18 05:40:53

+0

表格每5秒更新一次行,我們沒有手動設置標誌,標誌不是頻繁的,它可能在一個小時內發生一次或兩次。 – user1340004 2012-04-18 09:20:07