2013-11-25 62 views
1

这是一个开放式的“我应该如何最好地解决这个问题”的问题。我有一个表(dbo.session_dates),它将接收日期(没有时间戳),并且每个日期都是唯一的。没有特定的顺序来输入这些日期。可能会插入2013-11-25,然后是2011-06-07,然后是2012-03-22等 - 但最终它会连续保留大多数周日期,可能会在这里或那里丢失日期。所以你可以画出一张大致连续的日期表,不包括周末日期,也许在这里和那里错过了几个日期。TSQL日期和数字

我希望最终能够及时选择X个“会话”,例如, “向我展示最近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

你绝对不需要#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; 
+0

我知道这将涉及一个WITH语句...仍然使用这些新的。谢谢一堆 – user2059532