Выберите вершину и нижние ряды

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

SELECT TOP(5) BOTTOM(5)

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

12
задан alex 22 June 2016 в 20:37
поделиться

6 ответов

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

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
22
ответ дан 2 December 2019 в 03:25
поделиться

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

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
7
ответ дан 2 December 2019 в 03:25
поделиться

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

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) 
  )

EDITED

select * from table where id in ( 
           (SELECT TOP 5 id ORDER BY columnName) OR 
           (SELECT TOP 5 id ORDER BY columnName DESC) 
  )
1
ответ дан 2 December 2019 в 03:25
поделиться

Можно ли использовать объединение?

Например

select top 5 ... order by {specify columns asc} 
union 
select top 5 ... order by {specify columns desc}
3
ответ дан 2 December 2019 в 03:25
поделиться

Посмотрите ссылку

SQL SERVER - How to Retrieve TOP and BOTTOM Rows Together using T-SQL

Вы пытались использовать rownumber?

SELECT * 
FROM 
(SELECT *, ROW_NUMBER() OVER (Order BY columnName) as TopFive
   ,ROW_NUMBER() OVER (Order BY columnName Desc) as BottomFive
   FROM Table
)
WHERE TopFive <=5 or BottomFive <=5

http://www.sqlservercurry.com/2009/02/select-top-n-and-bottom-n-rows-using.html

8
ответ дан 2 December 2019 в 03:25
поделиться

Тогда вы в пролете - повторное выполнение select является единственным вариантом, если только вы не хотите получить полный набор результатов и затем выбросить все, что между ними.

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

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

1
ответ дан 2 December 2019 в 03:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: