SQL查询根据值

时间:2015-06-30 11:02:38

标签: sql sql-server performance

使用SQL Server 2012 Express。

下面的SQL查询速度非常慢,需要建议来提高性能或提高效率。

它会查询名为PriceDaily的表,并在Date列中查询给定日期,例如2009/11/27(日期可以是任何日期,实际上由变量确定)。

按日期排序,然后需要将X记录向上移动(+ X)或向下移动(-X)并返回该记录中日期字段的值。例如对于-5,它将向上移动5个记录并返回日期值。

e.g。它将返回2009/11/20如果表格的一部分看起来像这样(因为2009/11/20是5 2009/11/27以上的记录):

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

有关如何优化此查询的任何建议都将受到高度赞赏

2 个答案:

答案 0 :(得分:0)

可以仅使用窗口函数来表达这一点:

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中的偏移量和比较方向。

答案 1 :(得分:0)

尝试以下,

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))