使用Server 2012 Express。
下面的SQL查询非常慢,需要一些建议来提高性能或更有效地执行它。
它查询一个名为PriceDaily的表,并查询给定日期的Date列,例如2009/11/27 (日期可以是任意日期,实际上将由变量确定)。
按日期排序,然后需要将X记录向上(+X)或向下(-X)移动,并返回日期字段的记录中的值。例如,对于-5,它将向上移动5条记录并返回日期值。
例如,如果表的一部分如下所示,它将返回2009/11/20 (因为2009/11/20是2009/11/27之上的5条记录):
2009/11/20
2009/11/23
2009/11/24
2009/11/25
2009/11/26
2009/11/27
2009/11/30
2009/12/01
2009/12/02
2009/12/03
2009/12/04要优化的查询:
with Records AS
(
select
row_number() over(order by date) as 'row',
*
from [NIG03].[dbo].[PriceDaily]
)
select Date
from records
where row = (SELECT Top 1 ROW_NUMBER() OVER(ORDER BY Date DESC) AS Row
FROM [NIG03].[dbo].[PriceDaily]
WHERE [NIG03].[dbo].[PriceDaily].Date<'2009/11/27'
ORDER BY Date) - X + 1任何关于如何优化此查询的建议都将受到高度赞赏。
发布于 2015-06-30 11:09:02
您可以只使用窗口函数来表示这一点:
select pd.*,
max(case when date = '2009-11-27' then seqnum end) as date_seqnum
from (select pd.*,
row_number() over (order by date) as seqnum
from PriceDaily pd
) pd
where seqnum = date_seqnum - X + 1;对于这个查询(以及您的查询),我认为性能的问题是需要在date上建立索引
create index idx_pricedaily_date on PriceDaily(date);有一种替代办法(也将受益于该指数):
select pd.*
from PriceDaily pd
where date >= '2009-11-27'
order by date
offset X rows fetch first 1 row only;当然,您需要将where中的偏移量和比较的方向调整为X的不同值。
发布于 2015-06-30 11:28:43
试着跟着,
declare @date date = '2009/11/27'
declare @up int = -5
with Records AS
(
select row_number() over(order by date) as 'row',
*
from [NIG03].[dbo].[PriceDaily]
)
select Date from records
where row=((select row from record where Date = @date) + (@up))https://stackoverflow.com/questions/31136501
复制相似问题