Подтвердить что ты не робот

Выберите верхнюю и нижнюю строки

Я использую SQL Server 2005, и я пытаюсь добиться чего-то вроде этого: Я хочу получить первые строки x и последние x строк в одном и том же предложении select.

SELECT TOP(5) BOTTOM(5)

Конечно, BOTTOM не существует, поэтому мне нужно другое решение. Я считаю, что есть простое и элегантное решение, которое я не получаю. Повторное выполнение выбора с помощью GROUP BY DESC не является параметром.

4b9b3361

Ответ 1

Использование единства - единственное, что я могу придумать, чтобы выполнить этот

select * from (select top(5) * from logins order by USERNAME ASC) a
union
select * from (select top(5) * from logins order by USERNAME DESC) b

Ответ 3

Я думаю, у вас есть два основных варианта:

SELECT TOP 5 ...
FROM ...
ORDER BY ... ASC

UNION

SELECT TOP 5 ...
FROM ...
ORDER BY ... DESC

Или, если вы знаете, сколько элементов в таблице:

SELECT ...
FROM (
    SELECT ..., ROW_NUMBER() OVER (ORDER BY ... ASC) AS intRow
    FROM ...
) AS T
WHERE intRow BETWEEN 1 AND 5 OR intRow BETWEEN @Number - 5 AND @Number

Ответ 4

Можно ли использовать союз?

например.

select top 5 ... order by {specify columns asc} 
union 
select top 5 ... order by {specify columns desc}

Ответ 5

Нет реальной разницы между этим и объединением, о котором я знаю, но технически это единственный запрос.

select t.* 
from table t
where t.id in (select top 5 t2.id from table t2 order by MyColumn)
    or
    t.id in (select top 5 t2.id from table t2 order by MyColumn desc);

Ответ 6

Затем вы не выполняете выбор снова. Это единственный вариант, если вы не хотите вытащить полный результирующий набор и затем отбросить все между ними.

ЛЮБОЙ sql я cna думает, что это то же самое - для нижней части вам нужно сначала знать, сколько у вас предметов (материализуйте все или используйте count (*)) или обратный порядок сортировки.

Извините, если это вас не устраивает, но в конце... реальности все равно, и я не вижу другого способа сделать это.

Ответ 7

Я думаю, вы должны сделать это, используя только подзапрос

select * from table where id in ( 
           (SELECT id ORDER BY columnName LIMIT 5) OR 
           (SELECT id ORDER BY columnName DESC LIMIT 5) 
  )


select * from table where id in ( 
           (SELECT TOP(5) id ORDER BY columnName) OR 
           (SELECT TOP(5) id ORDER BY columnName DESC) 
  )

отредактированы

select * from table where id in ( 
           (SELECT TOP 5 id ORDER BY columnName) OR 
           (SELECT TOP 5 id ORDER BY columnName DESC) 
  )

Ответ 8

Мне пришлось сделать это недавно для очень большой хранимой процедуры; если ваш запрос достаточно велик, и вы хотите свести к минимуму количество запросов, которые вы могли бы объявить @tempTable, вставьте в этот @tempTable запрос из этого @tempTable,

DECLARE @tempTable TABLE ( columns.. )
INSERT INTO @tempTable
VALUES ( SELECT.. your query here ..)

SELECT TOP(5) columns FROM @tempTable ORDER BY column ASC -- returns first to last
SELECT TOP(5) columns FROM @tempTable ORDER BY column DESC -- returns last to first