我正在尝试实现一个有点不同的分页例程。
为了一个简单的例子,让我们假设我有一个表定义和填充如下:
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 包含在一个 ParentId
中,建议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/