我要问的是,我在这里的论坛帖子中遇到了困难,所以任何帮助都将不胜感激! :)
为了帮助解释我想要的内容,这里有一个我正在使用的视图结果集的小片段:
CalendarDate: WorkDay:
2014-10-03 00:00:00.000 1
2014-10-02 00:00:00.000 1
2014-10-01 00:00:00.000 1
2014-09-30 00:00:00.000 1
2014-09-29 00:00:00.000 1
2014-09-26 00:00:00.000 1
2014-09-25 00:00:00.000 1
此视图代表我们数据库中的一个表,用于跟踪公司的实际工作日;这种观点排除了任何非工作日(因此都是“1”)。
我要做的是从另一个结果集中获取日期时间值,在此结果集中找到它并倒数天数(基于从另一个结果集中引入的值) )。所以,如果我从2014年10月3日开始,我回去的天数是5,我想在2014年9月26日结束。
就个人而言,我看到这是在预先排序的视图上以唯一记录计数完成的,但SQL是一个多样化的方法来做同样的事情,我想以最有效的方式实现这一点:)
就像我刚开始说的那样,我不知道这个问题应该措辞得当,所以如果这是一个重复的帖子,那么我道歉。
答案 0 :(得分:2)
您可以使用row_number
分析函数,然后导出天数差异
假设你的第二个结果集是这样的
create table Table2
( StartDate datetime,
days int
);
insert into Table2 values ('2014-10-03', 5);
insert into Table2 values ('2014-10-02', 5);
您可以使用此结果集加入当前表,并使用cte和row_number以及自联接获取所需的输出日期。
with cte
as
(
select CalendarDate, row_number() over ( order by CalendarDate desc) as rn, WorkDay
from Table1
)
select T1.StartDate, T1.days, T2.CalendarDate as OutDate from
cte
join Table2 T1
on cte.calendarDate = T1.StartDate
join cte T2
on T2.rn - cte.rn = T1.days
结果会像
一样出现STARTDATE DAYS OUTDATE
October, 03 2014 5 September, 26 2014
October, 02 2014 5 September, 25 2014
答案 1 :(得分:2)
当你使用TOP-Clause时:
SELECT TOP 1 CalendarDate
FROM (SELECT TOP 5 CalendarDate
FROM DateTable
WHERE CalendarDate <'2014-10-03'
ORDER BY CalendarDate DESC
) AS T5
ORDER BY CalendarDate ASC