如何优化查询,在where子句中添加行号

时间:2014-05-14 07:06:45

标签: sql-server

在表格中,我有超过700,000条记录。当我运行此查询时,获取行需要3分钟以上,并返回基于rowNum的390条记录。有优化此查询的方法吗?

SELECT  ID, Lat, Long,  SDateTime,
row_number() OVER (partition BY [ID] ORDER BY [SDateTime] DESC) AS rowNum
into #temp
FROM    
dbo.myTable WITH (NOLOCK)

select * from #temp where rowNum = 1    -- returns 390 records
drop table #temp

我可以在一个查询中选择数据而不将其放在临时表中吗?像这样:

SELECT  ID, Lat, Long,  SDateTime,
row_number() OVER (partition BY [ID] ORDER BY [SDateTime] DESC) AS rowNum

FROM    
dbo.myTable WITH (NOLOCK)
where (row_number() OVER (partition BY [ID] ORDER BY [SDateTime] DESC)) = 1

2 个答案:

答案 0 :(得分:0)

尝试这样做!

select * from 
(
SELECT  ID, Lat, Long,  SDateTime,
row_number() OVER (partition BY [ID] ORDER BY [SDateTime] DESC) AS rowNum
FROM    
dbo.myTable WITH (NOLOCK)
)x
where x.rowNum=1

答案 1 :(得分:0)

这应该可以完成这项工作,但它可以很好地使用索引(id,SDateTime)

;with d as (
  select distinct id
  from myTable
)
select 
  mt.*
from d
cross apply (
  select top 1 *
  from myTable m
    on m.id = d.id
  order by [SDateTime] DESC
) mt