选择特定 ID 后的行

Eya*_*lah 6 sql-server t-sql sql-server-2012

我有以下查询,它从新闻文章表中选择。由于多种排序因素,我找不到日期的下一页。

我拥有的参数是查询结果集中的最后一个ID,那么我如何才能获取下一页...同样,我没有页面索引,我只有上一个查询结果集中的最后一个ID

SELECT        TOP (20) id, DATEDIFF(SECOND, CONVERT(DATETIME, '1970-01-01', 102), release_date) AS date, DATEDIFF(SECOND, CONVERT(DATETIME, '1970-01-01', 
                     102), edit_date) AS lastchanged, important
FROM            articles AS news WITH (NOLOCK)
WHERE        (status = 1) AND (release_date <= GETUTCDATE())
ORDER BY important DESC, date DESC, lastchanged DESC
Run Code Online (Sandbox Code Playgroud)

这是我的数据的一个例子

  id       date     lastchanged important
187346  1366070400  1345212540  1
187306  1365984000  1345290300  1
187330  1365984000  1342457880  1
187344  1363392000  1342461540  1
187343  1363392000  1342461300  1
187342  1363392000  1342459980  1
187339  1363392000  1342459800  1
187337  1363392000  1342458960  1
187335  1363392000  1342458720  1
187334  1363392000  1342458600  1
187332  1363392000  1342458060  1
187331  1363392000  1342457940  1
187327  1363392000  1342457340  1
187328  1363392000  1342457340  1
187326  1363392000  1342456860  1
187323  1363392000  1342456020  1
187322  1363392000  1342455480  1
187321  1363392000  1342454700  1
187316  1363392000  1342454580  1
187320  1363392000  1342454520  1
Run Code Online (Sandbox Code Playgroud)

Ada*_*nes 5

你可以用 row_number() 做这样的事情。性能可能取决于每天有多少活跃文章。

此代码根据您提供的排序创建一个 seq,然后找到最后一个 Id 值的序列,您可以使用它来获取前 (x) 行。

declare @LastId INT,
        @PageSize INT

set @LastId = 187322
set @PageSize = 2

;with cte
as(
SELECT *, seq = ROW_NUMBER() over(ORDER BY important DESC, release_date DESC, edit_date DESC)
FROM @demo d
WHERE 
    status = 1
    AND release_date <= GETUTCDATE()
)
select TOP (@PageSize) *
from cte t1
where t1.seq > (select seq from cte t2 where id = @LastId)
Order by t1.seq
Run Code Online (Sandbox Code Playgroud)