首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL查询根据值选择先前的记录

SQL查询根据值选择先前的记录
EN

Stack Overflow用户
提问于 2015-06-30 11:02:38
回答 2查看 231关注 0票数 1

使用Server 2012 Express。

下面的SQL查询非常慢,需要一些建议来提高性能或更有效地执行它。

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

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

例如,如果表的一部分如下所示,它将返回2009/11/20 (因为2009/11/202009/11/27之上的5条记录):

代码语言:javascript
复制
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

要优化的查询:

代码语言:javascript
复制
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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-30 11:09:02

您可以只使用窗口函数来表示这一点:

代码语言:javascript
复制
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上建立索引

代码语言:javascript
复制
create index idx_pricedaily_date on PriceDaily(date);

有一种替代办法(也将受益于该指数):

代码语言:javascript
复制
select pd.*
from PriceDaily pd
where date >= '2009-11-27'
order by date
offset X rows fetch first 1 row only;

当然,您需要将where中的偏移量和比较的方向调整为X的不同值。

票数 1
EN

Stack Overflow用户

发布于 2015-06-30 11:28:43

试着跟着,

代码语言:javascript
复制
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))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31136501

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档