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分钟数据等.它不会混合.
出于报告和演示目的,我想实现以下分页:
TimeStamppageSize(例如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: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
Run Code Online (Sandbox Code Playgroud)
ROW_NUMBER确保满足最小pageSize,但RANK将包含额外的关系.
我认为你使用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)