获取最新记录每种类型[复制]

问题描述 投票:0回答:1

这个问题已经在这里有一个答案:

我有称为度量一个实体表,以及每个度量具有随时间改变的值。我存储在另一个表这个不断变化的值称为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)

我可以看到另一种方法是在指标表中另外的时间戳列和更新,每一次我更新历史记录表,但似乎没有任何的权利。

我应该写在这里查询,或者我的表设计错了吗?我倾向于前者。

mysql greatest-n-per-group
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.