获取每种类型的最新记录

时间:2019-02-06 21:37:50

标签: mysql greatest-n-per-group

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

指标:

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

metric_history:

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)

我可以看到的另一种选择是在指标表中增加一个时间戳列,并在每次更新历史记录表时对其进行更新,但这似乎也不正确。

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

1 个答案:

答案 0 :(得分:0)

使用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