MySQL - 选择ID下的行,按具有最新时间戳的列值分组

标签 mysql sql database

表:

----------------------------------------------------
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/

相关文章:

php - SELECT - 拆分字段内容

PHP 获取当前登录用户的邮箱

mysql - 重复的 MySQL 父子记录

sql - 在 PostgreSQL 中获取时间戳年份

c# - Mysql数据库副本供离线使用

mysql - 在数据库中存储动态字段的最佳实践

java - @GenerateValue ID 尝试复制现有数据库 MySQL Java 中条目的主键

php - 获取 Zend 1 中先前存在的 MySQL 行

c# - 如何强制 LINQ to SQL 对可为空的外键执行 INNER JOIN?

mysql - 我怎样才能对数据透视列的一部分进行 AVG 值计算?