2013-03-01 119 views
2

我有一張生產讀數表,需要獲得包含每小時min(timestamp)行的結果集。 列布局非常簡單: ID,時間戳,SOURCE_ID,SOURCE_VALUEMySQL - 如何選擇給定日期每小時min(timestamp)的行

的數據樣本將如下所示:

123, '2013-03-01 06:05:24',PMPROD,12345678.99
124,'2013-03-01 06:15:17',PMPROD,88888888.99
125,'2013-03-01 06:25:24',PMPROD,33333333.33
126,'2013-03-01 06 :38:14',PMPROD,44444444.44
127,'2013-03-01 07:12:04',PMPROD,55555555.55
128,'2013-03-01 10:38:14',PMPROD,44444444.44
129, '2013-03-01 10:56:14',PMPROD,22222222.22
130, '2013-03-01 15:28:02',PMPROD,66666666.66

記錄被添加到該並且source_value已經計算好了,所以不需要總和。

我無法弄清楚如何獲得current_date的每小時的最小(時間戳)行

select * 
from source_readings 
use index(ID_And_Time) 
where source_id = 'PMPROD' 
and date(timestamp)=CURRENT_DATE 
and timestamp = 
     (select min(timestamp) 
      from source_readings use index(ID_And_Time) 
      where source_id = 'PMPROD' 
     ) 

上面的代碼當然給了我一個記錄。我需要一個記錄的最小值(小時(時間戳))的current_date。

我的結果集應該包含ID的行:123,127,128,130。我已經玩了好幾個小時了。誰可以成爲我的英雄? :)

回答

2

嘗試以下:

SELECT * FROM source_readings 
JOIN 
(
    SELECT ID, DATE_FORMAT(timestamp, '%Y-%m-%d %H') as current_hour,MIN(timestamp) 
    FROM source_readings 
    WHERE source_id = 'PMPROD' 
    GROUP BY current_hour 
) As reading_min 
ON source_readings.ID = reading_min.ID 
+0

您所查詢的是正確的。但'DATE_FORMAT'以另一種方式接受參數([mysql doc](https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_date-format))。 [Here](http://sqlfiddle.com/#!2/1ab9e/3)是小提琴中的答案。 – chandimak 2013-03-01 18:03:03

+0

謝謝! chandimak,它運作完美!我需要研究該文檔以找出它的工作原理。不知道用DATE_FORMAT函數重新構建時間戳的過程,但似乎是它的關鍵。 – mwm4 2013-03-01 18:09:56

+0

@ mwm4我仔細檢查了這一點。這並沒有給出正確的答案。但是,@JW。的答案返回正確的結果。在這個答案中,「group by」值存在問題。您可以通過交換[fiddle](http://sqlfiddle.com/#!2/7dfba/1)中的前2個時間戳值來檢查錯誤。有類似的問題,並參考[這個答案](http://stackoverflow.com/questions/15155178/mysql-get-last-update-values-from-mysql-table/15157018#15157018)。希望它會有用。 – chandimak 2013-03-01 18:37:07

1
SELECT a.* 
FROM Table1 a 
     INNER JOIN 
     (
      SELECT DATE(TIMESTAMP) date, 
        HOUR(TIMESTAMP) hour, 
        MIN(TIMESTAMP) min_date 
      FROM Table1 
      GROUP BY DATE(TIMESTAMP), HOUR(TIMESTAMP) 
     ) b ON DATE(a.TIMESTAMP) = b.date AND 
       HOUR(a.TIMESTAMP) = b.hour AND 
       a.timestamp = b.min_date 
+0

這對你有幫助嗎? – 2013-03-02 01:09:05