mysql 基于一列从表中检索最近的几条记录

vhipe2zx  于 2023-03-22  发布在  Mysql
关注(0)|答案(3)|浏览(119)

我试图从表中检索最新的几条记录的基础上分组的列值之一,这不是一个主键。这意味着将有一个以上的行为一个特定的列值,我希望的结果分组。数据库是基于MySQL的。
表度量方案

TestID BuildId TestResult  TestMetrics
a123     b345     Pass       metric1
a234     b234     Fail       metric2
a345     b345     Fail       metric3
a456     b123     Fail       metric4
a567     b234     Pass       metric5

例如,我想从上表中检索最新的两个构建数据。
预期结果:

TestID BuildId TestResult  TestMetrics
a123     b345     Pass       metric1
a345     b345     Fail       metric3
a234     b234     Fail       metric2
a567     b234     Pass       metric5

TestID是主键。现在我想从表中检索最新的2构建信息,并按buildId降序显示结果(latest)。
我现在有的是

select * from Metrics as m inner join 
   (select n.BuildId from Metrics as n group by n.BuildId order by n.BuildId desc limit 2)
on m.BuildId = n.BuildId
order by BuildId desc

这看起来效率很低,因为表中包含大量的指标数据。我可以根据测试运行的特定开发分支过滤where子句。
有没有更好的方法来达到预期的效果?

dm7nw8vv

dm7nw8vv1#

我相信您可以通过使用窗口函数row_number来实现这一点
例如

with mm as 
  (select *, ROW_NUMBER() OVER(partition by buildid order by TestID desc) as nrow from metrics) 
select * 
from mm 
where nrow <=2 
order by buildId, nrow;
t0ybt7op

t0ybt7op2#

一种方法是使用MAX函数的子查询来查找所有TestMetrics值的最新BuildId,然后将结果与Metrics表连接以获得相应的TestIDTestResult值。
在代码中,您应该有

SELECT m.TestID, m.BuildId, m.TestResult, m.TestMetrics
FROM Metrics m
JOIN (
  SELECT TestMetrics, MAX(BuildId) AS latestBuildId
  FROM Metrics
  GROUP BY TestMetrics
  ORDER BY latestBuildId DESC
  LIMIT 2
) latest ON m.TestMetrics = latest.TestMetrics AND m.BuildId = latest.latestBuildId
ORDER BY m.BuildId DESC;
8ehkhllq

8ehkhllq3#

Ervis的回答给我指出了正确的方向,尽管不是我想要的。所以在问题的上下文中,把这篇文章作为正确的答案。
我希望window函数为具有相同buildId的行生成相同的数字,这就是DENSE_RANK()的作用。下面是我想要的确切解决方案。

with mm as 
  (select *, DENSE_RANK() OVER(order by BuildId desc) as nrow from metrics) 
select * 
from mm 
where nrow <=2 
order by buildId, nrow;

相关问题