我有一个称为度量的实体表,每个度量都有一个随时间变化的值。我将这个变化的值存储在另一个名为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)
我可以看到的另一种选择是在指标表中增加一个时间戳列,并在每次更新历史记录表时对其进行更新,但这似乎也不正确。
我应该在这里编写查询还是我的表设计错误?我倾向于前者。
答案 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