我有一张这样的桌子:
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搜索什么。
答案 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