2017-09-14 149 views
1

我有此表從我必須選擇最新的行中每個位置一列選擇最新的記錄組

| location | parameter | datetime    | value | 
--------------------------------------------------------------------- 
| Location 1 | P1   | 2017-09-13 05:00:00  | 0.68 | 
| Location 1 | P2   | 2017-09-13 05:00:00  | 6  | 
| Location 1 | P3   | 2017-09-13 06:00:00  | 19 | 
| Location 1 | P4   | 2017-09-13 06:00:00  | 1  | 
| Location 2 | P1   | 2017-09-13 05:00:00  | 0.1 | 
| Location 2 | P2   | 2017-09-13 05:00:00  | 2  | 
| Location 2 | P3   | 2017-09-13 06:00:00  | 26 | 
| Location 2 | P5   | 2017-09-13 06:00:00  | 7.9 | 
| Location 2 | P4   | 2017-09-13 07:00:00  | 0  | 
| Location 3 | P1   | 2017-09-13 04:00:00  | 0.47 | 
| Location 3 | P2   | 2017-09-13 05:00:00  | 1  | 
| Location 3 | P3   | 2017-09-13 04:00:00  | 25 | 
| Location 3 | P5   | 2017-09-14 05:00:00  | 3.8 | 
--------------------------------------------------------------------- 

enter image description here

我曾嘗試以下查詢,但兩者都沒有返回每個位置的最新數據。

SELECT * FROM mytable WHERE 
datetime in (SELECT max(datetime) FROM myTable Group by location) 
group by location; 

SELECT * FROM myTable AS t1 
INNER JOIN 
(
    SELECT MAX(datetime) AS maxDate 
    FROM myTable 
    GROUP BY location 
) AS t2 ON t1.datetime = t2.maxDate group by t1.location; 

兩個查詢返回錯誤的數據位置2.

一旦做到這一點我也想在最新的日期相同,則查詢添加另一個條件按值排序desc並選擇最高值的記錄。

預期的輸出是

| location | parameter | datetime    | value | 
--------------------------------------------------------------------- 
| Location 1 | P3   | 2017-09-13 06:00:00  | 19 | 
| Location 2 | P4   | 2017-09-13 07:00:00  | 0  | 
| Location 3 | P5   | 2017-09-14 05:00:00  | 3.8 | 
--------------------------------------------------------------------- 

但查詢我試圖返回錯誤的日期,地點2.

任何幫助表示讚賞。

+1

你如何識別最新行如果兩個行具有相同的'datetime'? –

+0

這並不重要,任何與每個位置的最新日期的行都會很好,但我想添加另一個條件,正如我在問題中提到的那樣。 – Ana

+0

您是否也可以發佈預期的結果集?還優選包括樣本數據以及格式化文本而不是圖像。 –

回答

1

可以使用變量此:

SELECT location, parameter, datetime, value 
FROM (
    SELECT location, parameter, datetime, value, 
      @seq := IF(@loc = location, @seq + 1, 
        IF(@loc := location, 1, 1)) AS seq 
    FROM mytable 
    CROSS JOIN (SELECT @seq := 0, @loc = '') AS vars 
    ORDER By location, datetime desc, value desc) AS t 
WHERE t.seq = 1 

內查詢有一個ORDER BY條款,首先返回自己的片內的最新要求每組記錄。對於第一個記錄,變量@seq使用由IF函數實現的邏輯設置爲1。外部查詢只是簡單地過濾派生表以獲取每個location切片的預期記錄。

Demo here

+0

這是完美的,謝謝:) – Ana

1

您需要首先得到每個位置的最新時間,例如:

SELECT location, MAX(`datetime`) 
FROM table 
GROUP BY location; 

,然後與同桌加入,例如:

SELECT t1.* 
FROM table t1 JOIN (
    SELECT location, MAX(`datetime`) 
    FROM table 
    GROUP BY location 
) a 
ON t1.location = a.location AND t1.datetime = a.datetime; 

您可以通過添加排序結果ORDER BY t1.value DESC或任何其他列。