2011-01-25 2 views
24

Как я могу вернуть каждую запись nth из подзапроса на основе числового параметра, который я поставляю?Вернуть строку каждой n-ой записи

Например, я могу иметь следующий запрос:

SELECT 
    Id, 
    Key 
FROM DataTable 
WHERE CustomerId = 1234 
ORDER BY Key 

например,

Результат подзапроса может выглядеть следующим образом:

Row Id Key 
1 1 A3231 
2 43 C1212 
3 243 E1232 
4 765 G1232 
5 2432 E2325 
... 
90 3193 F2312 

Если я прохожу в количестве 30, и множество суб результат запроса содержал 90 записей, я бы Получать на тридцатые, , и 90th ряд.

Если я пройти в количестве 40, и результирующий набор содержал 90 записей, я бы Получать на сороковых и восьмидесятых строку.

В качестве побочного примечания, для получения справочной информации это используется для захвата ключа/идентификатора каждой n-й записи для пейджингового управления.

+0

Обратите внимание, что без 'ORDER BY' вы получите результаты в произвольном порядке, поэтому вы можете просто ограничить * первый * N результатов. –

+0

@Oli Спасибо, забыл добавить это. Результаты всегда будут в одном порядке и никогда не изменятся. –

ответ

43

Здесь ROW_NUMBER может помочь. Для этого требуется предложение order-by, но это нормально, потому что присутствует заказ (и требуется, чтобы гарантировать определенный заказ).

SELECT t.id, t.key 
FROM 
(
    SELECT id, key, ROW_NUMBER() OVER (ORDER BY key) AS rownum 
    FROM datatable 
) AS t 
WHERE t.rownum % 30 = 0 -- or % 40 etc 
ORDER BY t.key 
+2

@pst: Функция окна «ROW_NUMBER» не является проприетарным расширением TSQL. Это часть стандарта SQL (по-моему, с SQL2003). – LukeH

+0

выглядит так http://my.safaribooksonline.com/book/databases/sql/0596004818/sql-functions/sqlnut2-chp-4-sect-3 –

7

Вам не нужно использовать номер строки, любое целое поле будет делать. На большинстве таблиц у нас есть поле autonumber. Для простоты я буду называть его ID. Для того, чтобы отобразить каждый 13-й рекорд:

Select ID, LastName, FirstName FROM Users WHERE ID%13 = 0 ORDER BY ID 
+6

Если строка удалена, предположительно, это больше не будет работать? –

+2

Спасибо, это простое решение работает для моих целей (я строю общий тестовый набор данных, поэтому любые отсутствующие удаленные элементы не являются для меня проблемой) – Kmeixner

+1

Это не помогает, если запрос фильтруется с предложениями WHERE, поскольку тогда ID вскакивает случайно , – envision

1

Выберите B.name из (выберите row_number() над (заказ на заказ), как ROW_NUM, a.name из (выберите название, 'P1', как заказ от [DBO] . [every_2nd_record]) A) B где B.row_num% 2 = 0

Смежные вопросы