我试图从表中检索最新的几条记录的基础上分组的列值之一,这不是一个主键。这意味着将有一个以上的行为一个特定的列值,我希望的结果分组。数据库是基于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子句。
有没有更好的方法来达到预期的效果?
3条答案
按热度按时间dm7nw8vv1#
我相信您可以通过使用窗口函数row_number来实现这一点
例如
t0ybt7op2#
一种方法是使用MAX函数的子查询来查找所有
TestMetrics
值的最新BuildId
,然后将结果与Metrics
表连接以获得相应的TestID
和TestResult
值。在代码中,您应该有
8ehkhllq3#
Ervis的回答给我指出了正确的方向,尽管不是我想要的。所以在问题的上下文中,把这篇文章作为正确的答案。
我希望window函数为具有相同buildId的行生成相同的数字,这就是DENSE_RANK()的作用。下面是我想要的确切解决方案。