MySQL的 - 一个ID下选择行,由列值组具有最新时间戳

问题描述:

表: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(时间戳)在此查询线的东西任何指针感激,

非常感谢!

考虑你首先需要一组数据给每个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,但非常清晰,谢谢。 –

的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

检查编辑:你不能把两个字段放在一个'='比较中 –