Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在查询中包括上一条记录和下一条记录_Sql Server - Fatal编程技术网

Sql server 在查询中包括上一条记录和下一条记录

Sql server 在查询中包括上一条记录和下一条记录,sql-server,Sql Server,我需要返回一个折线图的查询,该折线图具有用户根据日期时间选择的边界,其中用户选择开始日期和结束日期。但是,数据通常是稀疏的,当选定边界的起点和终点附近没有值时,数据会从折线图的显示中消失 例如,如果我想选择2012年的所有数据,但第一条记录直到3月份才出现,那么我的折线图的轴从3月份开始 因此,基本上我需要将前面和后面的记录添加到按日期时间排序的返回集 现在,我只是使用UNION和SUBSELECT使其工作,但这似乎是SQL中可能内置的常见功能 下面是一个工作查询的示例,我如何改进它 -- S

我需要返回一个折线图的查询,该折线图具有用户根据日期时间选择的边界,其中用户选择开始日期和结束日期。但是,数据通常是稀疏的,当选定边界的起点和终点附近没有值时,数据会从折线图的显示中消失

例如,如果我想选择2012年的所有数据,但第一条记录直到3月份才出现,那么我的折线图的轴从3月份开始

因此,基本上我需要将前面和后面的记录添加到按日期时间排序的返回集

现在,我只是使用UNION和SUBSELECT使其工作,但这似乎是SQL中可能内置的常见功能

下面是一个工作查询的示例,我如何改进它

--  SQL Server example
--  Compare between start and end dates
--  Union with previous and next records for bounds

SELECT 
    change_date as event_date,
    value_column
FROM 
    testing.dbo.change_log 
WHERE change_date BETWEEN '2012-01-01 00:00:00:000' AND '2013-01-01 00:00:00:000'
UNION ALL
SELECT * FROM (
    SELECT TOP 1 '2013-01-01 00:00:00:000' as event_date, value_column FROM     testing.dbo.change_log WHERE change_date > '2013-01-01 00:00:00:000' ORDER BY change_date ASC
) AS next_rec
UNION ALL
SELECT * FROM (
    SELECT TOP 1 '2012-01-01 00:00:00:000' as event_date, value_column FROM testing.dbo.change_log WHERE change_date < '2012-01-01 00:00:00:000' ORDER BY change_date DESC
) AS prev_rec
ORDER BY change_date;

这个怎么样?我假设您将其用作存储过程,并且当前正在向其提供两个输入参数。这和你现在做的没什么不同,但可能会快一点

declare @lowerbound as datetime
declare @upperbound as datetime

;with ordered as (
select *
, row_num =  row_number() over (order by change_date)
from change_log
)
select * 
from ordered
where row_num >= (select row_num from ordered where change_date = @lowerbound) -1 
    and row_num <= (select row_num from ordered where change_date = @upperbound) + 1