MySQL选择-如果列值是多余的,则仅显示时间戳记中的最新值

时间:2018-10-31 09:39:29

标签: mysql

我有一张这样的桌子:

timesent            |nr | value 
2018-10-31 05:23:06 | 4 | Value 3
2018-10-31 05:20:19 | 4 | Value 2
2018-10-31 05:19:35 | 4 | Value 1
2018-10-31 04:55:56 | 3 | Value 2
2018-10-31 03:05:15 | 3 | Value 1
2018-10-31 01:31:49 | 2 | Value 1
2018-10-30 04:11:16 | 1 | Value 1 

此刻,我的选择如下:

SELECT * FROM values WHERE ORDER BY timesent DESC

我想执行一条sql-select语句,该语句只给我返回每个“ nr”的最新值。

我的技能不足以将其转换为sql语句。我什至不知道我应该用Google搜索什么。

1 个答案:

答案 0 :(得分:2)

Future[User](throw new RuntimeException)Reserved Keyword in MySQL。考虑将表名更改为其他名称;否则,您将不得不使用反引号

有多种方法可以解决您的问题。一种方法是在Values(仅想在其中获得最大nr值行的字段)上进行“自左联接”。

timesent

对于MySQL version >= 8.0.2,您可以使用Window Functions。我们将为SELECT v1.* FROM `values` AS v1 LEFT JOIN `values` AS v2 ON v1.nr = v2.nr AND v1.timesent < v2.timesent WHERE v2.nr IS NULL 分区上的每一行确定Row_Number(),其中nr以降序排列(最高timesent的行号为1)。然后,在Derived Table中使用此结果集,并仅考虑行号等于1的那些行。

timesent

但是,另一种方法是获取派生表中SELECT dt.timesent, dt.nr, dt.value FROM ( SELECT v.timesent, v.nr, v.value, ROW_NUMBER() OVER (PARTITION BY v.nr ORDER BY v.timesent DESC) AS row_num FROM `values` AS v ) AS dt WHERE dt.row_num = 1 组的timesent的最大值。现在,将此结果集连接到主表,以便仅显示与最大值对应的行:

nr