mysql - 获取每种类型的最新记录

标签 mysql greatest-n-per-group

我有一个名为指标的实体表,每个指标都有一个随时间变化的值。我将这个变化值存储在另一个名为 metric_history 的表中。

指标:

id, name, category
1, File, Disk
2, CPU, Hardware
3, Memory, Hardware
4, MySQL, Database

指标历史记录:

id, mId, value, recordCreated
1, 1, lorem, 2019-02-06 15:19:33
2, 1, ipsum, 2019-02-06 15:19:43
3, 2, at, 2019-02-06 15:37:48
4, 1, dolor, 2019-02-06 15:41:31
5, 2, vero, 2019-02-06 15:42:02
6, 1, sit, 2019-02-06 15:47:15
7, 2, eos, 2019-02-06 15:49:11
8, 1, amet, 2019-02-06 15:50:59
9, 4, sed, 2019-02-06 15:54:09

我正在尝试构建一个查询,该查询将返回每个查询的最新时间戳,因此在示例中将是:

结果:

8, 1, amet, 2019-02-06 15:50:59
7, 2, eos, 2019-02-06 15:49:11
9, 4, sed, 2019-02-06 15:54:09

我似乎在兜圈子,试图找到一个优雅的查询,但现在怀疑我的表格设计。这就是我所在的位置,似乎可以工作:

SELECT id, dmId, value, recordCreated
FROM metric_history
WHERE (dmId, recordCreated)
IN (SELECT DISTINCT dmId, MAX(recordCreated) FROM metric_history GROUP BY dmId)

我看到的另一种选择是在指标表中添加一个额外的时间戳列,并在每次更新历史表时更新该列,但这似乎也不正确。

我应该在这里编写查询还是我的表设计错误?我倾向于前者。

最佳答案

使用 MySQL-8.0、MariaDB-10.2 可以使用窗口函数得到答案 like this :

SELECT id, mId, value, recordCreated
FROM ( 
  SELECT 
    id, mId, value, recordCreated,
    ROW_NUMBER() OVER (PARTITION BY mId ORDER BY recordCreated DESC) AS `rank`
  FROM metric_history 
  ORDER BY id 
) AS tmp 
WHERE tmp.`rank` = 1

关于mysql - 获取每种类型的最新记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54562926/

相关文章:

sql - 最后一张发票使用 Postgres

循环不返回值的函数

一些值的 MySQL 自定义输出

mysql - MySQLi准备好的陈述?

Mysql 通过子查询返回的列表进行查询

sql - 在 SQL 中如何选择具有较高值的​​行?

sql - 如何获取具有最新2个版本号的记录

php - 如何在group by语句中使用order by子句

mysql - 如何创建两个不同 django 模型的联合?

mySQL:这是递归(或相互依赖)的一种形式吗?