我正在尝试实现一个有点不同的分页例程。

为了简单的示例,让我们假设我有一个定义和填充的表,如下所示:

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: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
    

    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/

    10-12 17:51
    查看更多