我有新闻表
News
-------
NewsId
NewsText
CREATED_DATE
我需要获取从指定日期到未知日期的新闻,但结果应包含 5 天的新闻。
例如:
- 如果我有与这些日期相关的新闻:29 日、28 日、27 日、5 日、4 日、3 日 并将开始日期指定为 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 天的旧限制
最佳答案
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
关于sql-server - TSQL - 如何优化查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8253080/