加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

T-SQL:使用TIES分页

发布时间:2020-12-12 08:31:08 所属栏目:MsSql教程 来源:网络整理
导读:我试图实现一个有点不同的寻呼程序. 为了一个简单的例子,我们假设我有一个定义和填充的表,如下所示: 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/
我试图实现一个有点不同的寻呼程序.

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

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,6);
INSERT INTO @Temp VALUES (2,7);
INSERT INTO @Temp VALUES (2,8);
INSERT INTO @Temp VALUES (3,6);
INSERT INTO @Temp VALUES (3,7);
INSERT INTO @Temp VALUES (3,8);

时间戳将始终是相同的间隔,例如每日数据,1小时数据,1分钟数据等.不会混合.

为了报告和呈现目的,我想实现分页:

> TimeStamp订单
>使用建议的pageSize(例如4)开始,但会自动调整以包括在TimeStamp上匹配的其他记录.换句话说,如果一个ParentId包含了1/1/2013 01:00,则建议的pageSize将被覆盖,并且所有ParentId都将包含所有小时01:00的记录.它几乎像TOP WITH TIES选项.

所以运行此查询的pageSize为4将返回6条记录.默认情况下,有3小时00:00和1小时01:00,但是因为01:00小时,所以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])

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读