2016-11-11 71 views
0

表:MySQL的 - 一個ID下選擇行,由列值組具有最新時間戳

---------------------------------------------------- 
ID | field_name | field_value | timestamp 
---------------------------------------------------- 
2 | postcode | LS1   | 2016-11-09 16:45:15 
2 | age  | 34   | 2016-11-09 16:45:22 
2 | job  | Scientist | 2016-11-09 16:45:27 
2 | age  | 38   | 2016-11-09 16:46:40 
7 | postcode | LS5   | 2016-11-09 16:47:05 
7 | age  | 24   | 2016-11-09 16:47:44  

我不知道是否有人能夠給我一些指點,基於上述數據,我想按ID 2查詢,爲每個唯一的field_name返回一行(如果多個行存在於具有相同field_name的相同ID下,則只返回具有最新時間戳的行)。

我已經設法幾乎通過對field_name進行分組來達到此目的,它將返回唯一行的列表,但不一定是最新的行。

SELECT * FROM fragment WHERE (id = :id) GROUP BY field_name 

我真的是在正是我應該做的事情在這裏,我怎麼能適應沿着MAX(時間戳)在此查詢線的東西任何指針感激,

非常感謝!

回答

1

考慮你首先需要一組數據給每個ID,FieldName和最大時間戳。 (生成該集)作爲內聯視圖(B下面)。然後,將這個集合(B)加回到你的基本集合中,允許內部連接消除不需要的行。

SELECT A.ID, A.field_name, A.field_value, A.timestamp 
FROM Table A 
INNER JOIN (SELECT ID, field_name, MAX(timestamp) TS 
      FROM table 
      GROUP BY ID, field_name) B 
on A.ID = B.ID 
and A.field_name = B.field_name 
and A.timestamp = B.TS 

的MySQL之外,這可能使用窗口/分析功能,你將能夠行號分配給每個記錄和消除這些> 1是這樣做....

SELECT B.* 
FROM (SELECT A.ID 
      , A.field_name 
      , A.field_Vale 
      , A.timestamp 
      , Rownumber() over (Order by A.timestamp Desc) RN 
     FROM Table A) B 
WHERE B.RN = 1 

或使用交叉限制或頂部應用。

+0

感謝很多的例子,我加你的邏輯,我的查詢,以及B(套)下我還添加了一個WHERE在我想要的ID通過返回,非常感謝解釋和其他例子,我當然只在這裏使用MySQL,但非常清晰,謝謝。 –

1

的Simpliest的方式來做到:

SELECT * 
    FROM fragment fra1 
    WHERE (id = :id) 
    and timestamp = (select max(timestamp) 
        from fragment fra2 
        where fra2.id = fra1.id 
         and fra2.field_name = fra1.field_name) 
    GROUP BY field_name 
+1

你需要在內部select中包含'field_name'。 –

+0

爲什麼外層組合(在'select *'上沒有聚合)?否則,相關的子查詢看起來好像會起作用。 – xQbert

+0

檢查編輯:你不能把兩個字段放在一個'='比較中 –

相關問題