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