我在下面有一个小查询,它RowNumber根据对“LegKey”列进行分区并按 UpdateID desc 排序,在该列下输出一个行号。因此,每个legkey 的最新更新行 (UpdateID) 始终为 1
SELECT *
, ROW_NUMBER() OVER(PARTITION BY LegKey ORDER BY UpdateID DESC) AS RowNumber
FROM Data.Crew
Run Code Online (Sandbox Code Playgroud)
输出数据:
UpdateID LegKey OriginalSourceTableID UpdateReceived RowNumber
7359 6641 11 2016-08-22 16:35:27.487 1
7121 6641 11 2016-08-15 00:00:47.220 2
8175 6642 11 2016-08-22 16:35:27.487 1
7122 6642 11 2016-08-15 00:00:47.220 2
8613 6643 11 2016-08-22 16:35:27.487 1
7123 6643 11 2016-08-15 00:00:47.220 2
Run Code Online (Sandbox Code Playgroud)
我使用这种方法的问题是性能变慢,因为我假设我使用的是 ORDER BY。
我的问题是有没有其他方法可以产生类似的结果,但让我的查询运行得更快?我想MAX()可能会起作用,但我没有得到与以前相同的输出。也许我做了MAX()错误的陈述,所以想知道如果有人可以提供一个关于他们如何MAX()为这个例子编写陈述的例子,这是否是一个很好的选择?
谢谢
大概这是您要优化的查询:
SELECT c.*
FROM (SELECT c.*,
ROW_NUMBER() OVER (PARTITION BY LegKey ORDER BY UpdateID DESC) AS RowNumber
FROM Data.Crew c
) c
WHERE RowNumber = 1;
Run Code Online (Sandbox Code Playgroud)
在 上尝试索引Crew(LegKey, UpdateId)。
如果您执行以下操作,也将使用此索引:
SELECT c.*
FROM Data.Crew c
WHERE c.UpdateId = (SELECT MAX(c2.UpdateId)
FROM Data.Crew c2
WHERE c2.LegKey = c.LegKey
);
Run Code Online (Sandbox Code Playgroud)