我正在嘗試實現一個有點不同的分頁例程。T-SQL:與TIES進行分頁
對於一個簡單的例子起見,讓我們假設我有一個表中定義和填充如下:
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
選項。
因此,使用4的pageSize
運行此查詢將返回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將包含其他關係。
什麼版本的SQL Server? – gbn
對不起。我應該提到我正在使用2008. –
你應該使用時間戳條件。對於第一個查詢'timestamp> minValue'(取決於你的列類型datetime或datetime2)。從查詢結果中讀取時間戳的最大值。對於下面的查詢,你可以使用這個max來過濾:'選擇帶*的頂部4 *來自@temp,其中timestamp> max' – tschmit007