sql-server - TSQL - 如何优化查询?

标签 sql-server algorithm tsql

我有新闻表

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/

相关文章:

sql - 转换为 float : CAST vs CONVERT vs *1. 0

sql-server - 根据 Select 语句的结果一次分配多个变量

algorithm - 算法简介(第 1-1 章)

sql - 更改现有的标识列增量值

sql-server - 为什么 UNION 只返回一个 null?

sql-server - 人们如何看待 Gupta Team Developer?

python - 如何改进我的代码以处理大量数据?

c++ - 与 2,3 和更多整数的子集和相关的想法

sql-server - 实际行数大于估计行数

sql-server - SP_EXECUTESQL在哪里定义的?