Запускать несколько запросов, каждый из которых выбирает каждую соответствующую N-ю строку?

`Связано с "Выбор каждой n-й строки из результата запроса SQL Server 2008, где в таблице нет столбца идентификатора строки», я понимаю, что при выполнении следующих действий будет выбрана каждая 4-я строка.

SELECT ID, Whatever FROM MyTable WHERE ID % 4 = 0

Но я хочу запустить 4 отдельных запроса, которые выбирают 4-ю строку, начиная с 1, 2, 3 и 4 соответственно. Будет ли это выглядеть так?

SELECT ID, Whatever FROM MyTable WHERE ID % 4 = 0

SELECT ID, Whatever FROM MyTable WHERE ID % 4 = 1

SELECT ID, Whatever FROM MyTable WHERE ID % 4 = 2

SELECT ID, Whatever FROM MyTable WHERE ID % 4 = 3

или, может быть

SELECT ID, Whatever FROM MyTable WHERE ID + 1 % 4 = 0

SELECT ID, Whatever FROM MyTable WHERE ID + 2 % 4 = 0

SELECT ID, Whatever FROM MyTable WHERE ID + 3 % 4 = 0

SELECT ID, Whatever FROM MyTable WHERE ID + 4 % 4 = 0

???


person JOATMON    schedule 22.05.2015    source источник
comment
Итак, если ваш идентификатор {1,2,3,4,5,6,7,8,9,10,11,12,13,14}, какой результат вы хотите? начиная с 1: {4,8,12} начиная со 2; {5,9,13} начиная с 3: {6,10,14} начиная с 4: {7,11} ??   -  person Juan Carlos Oropeza    schedule 22.05.2015
comment
Запрос A должен получить записи 1, 5, 9, 13. Запрос B должен получить записи 2, 6, 10, 14. Запрос C должен получить 3, 7, 11, а запрос D получить 4, 8, 12.   -  person JOATMON    schedule 26.05.2015


Ответы (2)


Протестируйте его на SQL 2008 SQL Fiddle

Определение таблицы

DROP TABLE [dbo].[testSQL];
CREATE TABLE [dbo].[testSQL](
    [ID] [int] NULL
) ON [PRIMARY]

insert into testSQL values (1);
insert into testSQL values (2);
insert into testSQL values (3);
insert into testSQL values (4);
insert into testSQL values (5);
insert into testSQL values (6);
insert into testSQL values (7);
insert into testSQL values (8);
insert into testSQL values (9);
insert into testSQL values (10);
insert into testSQL values (11);
insert into testSQL values (12);
insert into testSQL values (13);
insert into testSQL values (14);
insert into testSQL values (15);

Вам нужно только создать функцию, получающую @skip в качестве параметра

DECLARE @skip int;
DECLARE @total int;
SET @skip = 2; -- how many row will you skip in your case {0,1,2,3}

SELECT @total = (
    SELECT  count(*)
    FROM testSQL
) - @skip;   -- total rows - number row you want skip

-- here begin the magic
WITH SkipN (ID)  -- skip first N rows
AS
(
    SELECT TOP (@total) * 
    FROM testSQL
    ORDER BY ID DESC -- skip rows will be at the end
)   
, final AS ( -- assign new id
    SELECT ROW_NUMBER() OVER (ORDER BY ID) as new_id, * 
    FROM SkipN
)
SELECT *
FROM final
WHERE new_id % 4 = 0

РЕЗУЛЬТАТ для @skip = 2

введите здесь описание изображения

person Juan Carlos Oropeza    schedule 22.05.2015
comment
edit: О, я думаю, я понял. Не уверен, что смогу создавать функции, но посмотрю. - person JOATMON; 26.05.2015
comment
Это было намного сложнее, чем мне нужно, но слава :) - person JOATMON; 27.05.2015

я понял

Учитывая 20 строк и 4 итерации:

Ряды 1,5,9,13,17: SELECT ID, Whatever FROM MyTable WHERE ID % 4 = 1

Ряды 2,6,10,14,18: SELECT ID, Whatever FROM MyTable WHERE ID % 4 = 2

Ряды 3,7,11,15,19: SELECT ID, Whatever FROM MyTable WHERE ID % 4 = 3

Ряды 4,8,12,16,20: SELECT ID, Whatever FROM MyTable WHERE ID % 4 = 0

person JOATMON    schedule 26.05.2015
comment
Да, я тоже получил этот запрос, но неправильно понимаю требуемый результат. :(. Вот почему я делаю запрос слишком сложным, чтобы удалить первый элемент. - person Juan Carlos Oropeza; 27.05.2015