sql - T-SQL : Paging WITH TIES

标签 sql sql-server-2008 tsql

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

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

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

    相关文章:

    java - EclipseLink/JPA : Specify length of byte array

    sql - 从函数调用动态SQL

    sql-server-2008 - 投标 - SSIS - 错误时重定向行发送太多行

    c# - 是否有将 T-SQL 存储过程转换为 C# 的工具?

    sql-server - 使用 T-SQL 有条件地删除 SQL Server 中 XML 字段中的 XML 元素

    sql - 推荐的 SQL 实践和书籍

    sql - 使用 FOR XML PATH 将带有冒号的属性添加到 xml 节点

    sql - 模型数据库条目的图表

    SQL Server Like 查询不区分大小写

    python - 从 MSSQL 运行 Python 脚本