同一个表中每组最大的n组

时间:2016-08-26 00:04:30

标签: sql-server performance join sql-server-2008-r2 greatest-n-per-group

假设我有一个日志更改表。每个更改都可以覆盖同一组和同一模块的其他更改。我想获得一个更改列表以及在一个SELECT语句中覆盖的最后一个更改。如何才能获得最佳性能?

请在答案中使用这些表/列名称:

  • log_changes:id,groupid,moduleid,date

我试着遵循这个很棒的答案:SQL join: selecting the last records in a one-to-many relationship  但是性能不是很好,我说的是一个包含超过一百万行的表,并且有两个不同(可能是因为这不是正确答案),连接是使用相同的表和两列。

我尝试使用LAG功能,但性能不佳。 当我谈论糟糕的表现时,这意味着所有的桌子花费的时间超过5秒,我正试图获得更好的时间。

编辑:

如果我有:

id  groupid moduleid    date 
1   1       1           2016/09/07 
2   1       1           2016/09/06 
3   1       1           2016/09/05 
4   1       2           2016/09/07 
5   1       2           2016/09/06 
6   2       3           2016/09/07 
7   2       3           2016/09/08 

查询应返回:

id  last 
1   2 
2   3 
3   (0 or null)
4   5 
5   (0 or null) 
6   7 
7   (0 or null)

有意义吗?

1 个答案:

答案 0 :(得分:0)

如果您正在处理数百万条被评估的记录,那么您所做的任何事情都需要一些时间。多长时间取决于您的硬件。如果您可以使用某种过滤器(使用所讨论的表上支持的索引)来减少查询,则无论查询如何,您都可以获得更快的结果。我认为LAG窗口函数往往是您最快的方法,但是这会受到您是否有一个索引可以按照与LAG中的分区和顺序对应的顺序检索数据的影响。拥有该索引将允许引擎避免昂贵的排序操作。