表:
----------------------------------------------------
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返回一行(如果同一id下存在多个具有相同的行) field_name 然后只返回具有最新时间戳的行)。
我几乎通过对 field_name 进行分组来实现这一目标,这将返回唯一行的列表,但不一定是最新行。
SELECT * FROM fragment WHERE (id = :id) GROUP BY field_name
如果有人指出我到底应该在这里做什么,以及如何在这个查询中适应 MAX(timestamp) 的内容,我真的很感激,
非常感谢!
最佳答案
考虑您首先需要为每个 ID、FieldName 提供一组数据以及最大时间戳。 (生成该集)作为内联 View (下面的 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
或者使用带有限制或顶部的交叉应用。
关于MySQL - 选择ID下的行,按具有最新时间戳的列值分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40550237/