我正在尝试实现一个有点不同的分页例程。
为了简单的示例,让我们假设我有一个定义和填充的表,如下所示:
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
匹配的其他记录。换句话说,如果一个ParentId
包含1/1/2013 01:00,则建议的pageSize
将被覆盖,所有ParentId's
都将包含01:00的所有记录。这几乎类似于TOP WITH TIES
选项。 因此,使用
pageSize
为4运行此查询将返回6条记录。默认情况下,有3小时00:00和1小时01:00
,但是由于有更多的小时01:00's
,因此pageSize
将被覆盖以返回所有小时00: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将包括其他联系。
最佳答案
我认为您使用row_number()
和rank()
的策略过于复杂。
只需从数据中选择前4个时间戳即可。然后选择与那些时间戳匹配的任何时间戳:
select *
from @temp
where [timestamp] in (select top 4 [timestamp] from @temp order by [TimeStamp])
关于sql - T-SQL : Paging WITH TIES,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16860835/