这是一个开放式的"我应该如何最好地解决这个问题"题。我有一个表(dbo.session_dates),它将接收日期(没有时间戳),并且每个日期都是唯一的。没有特定的顺序来输入这些日期。可能会插入2013-11-25,然后是2011-06-07,然后是2012-03-22等 - 但最终它会连续保留大多数工作日日期,可能会在这里或那里缺少日期。所以你可以想象一个大致连续日期的表格,不包括周末日期,也许在这里和那里都会遗漏几个日期。
我希望最终能够选择"会话"及时,例如"告诉我最近20个会议"可能会延长200天,100天或20天(或通常约25至30天,不包括周末),具体取决于输入日期的方式。
我玩过Row_number函数,我想我可以用临时表(下面的代码)来做这个,但我似乎仍然需要将整个session_dates表选入临时表。:
IF OBJECT_ID('tempdb..#NumsAndDates') IS NOT NULL DROP TABLE #NumsAndDates
IF OBJECT_ID('tempdb..#NumsAndDates') IS NULL
CREATE TABLE #NumsAndDates(session_num int,session_date date);
insert into #NumsAndDates
select
ROW_NUMBER() over (order by session_date desc),
session_date
from dbo.session_dates
order by 2 desc;
select * from #NumsAndDates
where session_num <= 5
order by session_num asc;
这给了我临时表中的所有日期,我可以从中选择我想要的#个会话。
但我确信这是一个更优雅的解决方案......任何想法都会受到赞赏
答案 0 :(得分:1)
你绝对不需要#temp表。
;WITH x AS
(
SELECT session_date, rn = ROW_NUMBER() OVER (ORDER BY session_date DESC)
FROM dbo.session_date
)
SELECT session_date FROM x
WHERE rn <= 5
ORDER BY rn;