Я пытаюсь реализовать подкачку, которая немного отличается.
Для простого примера предположим, что у меня есть таблица, определенная и заполненная следующим образом:
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будет переопределен, и все записи за час 01:00 будут включены для всехParentId's. Это почти как опция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 будет содержать дополнительные связи.