我正在尝试实现一个有点不同的分页例程。
为了一个简单的例子,假设我有一个定义和填充的表,如下所示:
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);
TimeStamp
将始终是相同的时间间隔,例如每日数据、1 小时数据、1 分钟数据等。不会混用。
出于报告和演示目的,我想实现分页:
- 订单由
TimeStamp
- 开始使用建议的
pageSize
(比如 4),但会自动调整以包含与TimeStamp
. 换句话说,如果 1/1/2013 01:00 包含在 oneParentId
中,则建议pageSize
将被覆盖,并且所有 01:00 小时的记录都将包含在 allParentId's
中。这几乎就像TOP WITH TIES
选项一样。
因此,使用 of 4 运行此查询pageSize
将返回 6 条记录。默认情况下有 3 小时 00:00 和 1 小时01:00
,但是因为有更多 hour 01:00's
,所以pageSize
将被覆盖以返回所有 hour00:00
和01: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
ROW_NUMBER 确保满足最小 pageSize,但 RANK 将包括额外的关系。