2011-11-24 87 views
1

我有表新闻TSQL - 如何优化查询?

News 
------- 
NewsId 
NewsText 
CREATED_DATE 

我需要得到的消息从一个指定的日期到一个未知之日起,但结果应该包含新闻5天。

例如:

  • 如果涉及到这些日期的消息,我有:29日,28日,27日,第五,第四,第三 和起始日期指定日至29日,我需要在那里创建日期新闻29和4

之间,我不知道如何在这种情况下,低日期(4)无蛮力:

declare @highDate date = '2011-09-20'; 
declare @rows int = 0; 
declare @lowDate date = @highDate; 
declare @i int = 0; 

--Querying while rows count != 5 
WHILE (@rows != 5) 
BEGIN 

    if (@i = 60) 
     break; 

    set @i = @i + 1; 
    set @lowDate = (select DATEADD(day, -1, @lowDate)); 

    set @rows = (select COUNT(*) from 
     (SELECT DAY(CAST(CREATED_DATE AS date)) as c1 
     FROM .[dbo].[NEWS] 
     and CREATED_DATE > @lowDate 
     and CREATED_DATE < @highDate 
     group by DAY(CAST(CREATED_DATE AS date))) as rowsCount); 
END 

--then return news between to known dates 
SELECT * 
FROM [dbo].[NEWS] 
and CREATED_DATE > @lowDate 
and CREATED_DATE < @highDate 
order by CREATED_DATE desc 

我猜在该算法中,针对数据库的查询太多,我想摆脱60天限制

回答

3
declare @highDate date = '2011-09-20' 

select * from (
    select *, 
      dense_rank() over (order by cast(created_date as date) desc) rnk 
    from News 
    where CREATED_DATE <= @highDate 
) as t 
where t.rnk <= 5 
2

这可能对你有用。

declare @HighDate date = '2011-11-29' 
declare @LowDate date 

select @LowDate = min(N3.created_date) 
from (
     select top(5) N2.created_date 
     from (
      select distinct cast(N1.created_date as date) as created_date 
      from news as N1 
      where cast(N1.created_date as date) <= @HighDate 
      ) as N2 
     order by 1 desc 
    ) as N3 

或者你可以使用dense_rank

select @LowDate = N.created_date 
from (
     select created_date, 
      dense_rank() over(order by cast(created_date as date) desc) as rn 
     from News 
     where cast(created_date as date) <= @HighDate 
    ) as N 
where N.rn = 5