T-SQL:使用TIES进行分页

Joh*_*ell 10 sql t-sql sql-server-2008

我正在尝试实现一个稍微不同的分页例程.

为了一个简单的例子,我们假设我有一个表定义并填充如下:

DECLARE @Temp TABLE
(
    ParentId    INT,
    [TimeStamp] DATETIME,
    Value       INT
);

INSERT INTO @Temp VALUES (1, '1/1/2013 00:00', 6);
INSERT INTO @Temp VALUES (1, '1/1/2013 01:00', 7);
INSERT INTO @Temp VALUES (1, '1/1/2013 02:00', 8);
INSERT INTO @Temp VALUES (2, '1/1/2013 00:00', 6);
INSERT INTO @Temp VALUES (2, '1/1/2013 01:00', 7);
INSERT INTO @Temp VALUES (2, '1/1/2013 02:00', 8);
INSERT INTO @Temp VALUES (3, '1/1/2013 00:00', 6);
INSERT INTO @Temp VALUES (3, '1/1/2013 01:00', 7);
INSERT INTO @Temp VALUES (3, '1/1/2013 02:00', 8);
Run Code Online (Sandbox Code Playgroud)

TimeStamp 将始终是相同的间隔,例如每日数据,1小时数据,1分钟数据等.它不会混合.

出于报告和演示目的,我想实现以下分页:

  1. 订单 TimeStamp
  2. 使用建议pageSize(例如4)开始,但会自动调整以包含匹配的其他记录TimeStamp.换句话说,如果包含1/1/2013 01:00 ParentId,建议pageSize将被覆盖,并且所有人都将包括小时01:00的所有记录ParentId's.这几乎就像是TOP WITH TIES选项.

因此pageSize,使用4 运行此查询将返回6条记录.01:00默认情况下有3小时00:00和1小时,但因为还有更多的小时01:00's,所以pageSize会被覆盖以返回所有小时00:0001:00.

这是我到目前为止所做的,我认为我很接近,因为它适用于第一次迭代,但后续pageSize+行的后续查询不起作用.

WITH CTE AS
(
    SELECT ParentId, [TimeStamp], Value,
    RANK() OVER(ORDER BY [TimeStamp]) AS rnk,
    ROW_NUMBER() OVER(ORDER BY [TimeStamp]) AS rownum
    FROM @Temp
)

SELECT *
FROM CTE
WHERE (rownum BETWEEN 1 AND 4) OR (rnk BETWEEN 1 AND 4)
ORDER BY TimeStamp, ParentId
Run Code Online (Sandbox Code Playgroud)

ROW_NUMBER确保满足最小pageSize,但RANK将包含额外的关系.

Gor*_*off 0

我认为你使用row_number()and的策略rank()使事情变得过于复杂。

只需从数据中选取前 4 个时间戳即可。然后选择与这些匹配的任何时间戳:

select *
from @temp
where [timestamp] in (select top 4 [timestamp] from @temp order by [TimeStamp])
Run Code Online (Sandbox Code Playgroud)