3 回答
TA贡献1860条经验 获得超9个赞
;WITH cte AS( SELECT *, ROW_NUMBER() OVER (PARTITION BY DocumentID ORDER BY DateCreated DESC) AS rn FROM DocumentStatusLogs)SELECT *FROM cteWHERE rn = 1
在2个地方保持状态 保存状态历史 ...
TA贡献1830条经验 获得超9个赞
cross apply
select d.DocumentID, ds.Status, ds.DateCreated from Documents as d cross apply (select top 1 Status, DateCreated from DocumentStatusLogs where DocumentID = d.DocumentId order by DateCreated desc) as ds
TA贡献1942条经验 获得超3个赞
我在这里对各种建议做了一些时间安排,结果实际上取决于所涉及的表的大小,但最一致的解决方案是使用交叉应用-这些测试是针对SQLServer2008-R2运行的,使用的是一个记录为6500条的表,以及另一个记录为1.37亿条的表(相同的模式)。正在查询的列是表中主键的一部分,表的宽度非常小(约30字节)。SQLServer根据实际执行计划报告时间。
Query Time for 6500 (ms) Time for 137M(ms)
CROSS APPLY 17.9 17.9
SELECT WHERE col = (SELECT MAX(COL)…) 6.6 854.4
DENSE_RANK() OVER PARTITION 6.6 907.1
我认为真正令人惊讶的是,无论涉及的行数如何,交叉应用的时间是多么一致。
添加回答
举报