TSQL日期和数字

时间:2013-11-25 20:42:51

标签: sql sql-server temp-tables row-number

这是一个开放式的"我应该如何最好地解决这个问题"题。我有一个表(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;

这给了我临时表中的所有日期,我可以从中选择我想要的#个会话。

但我确信这是一个更优雅的解决方案......任何想法都会受到赞赏

1 个答案:

答案 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;