Выберите верхний и нижний ряды - PullRequest
12 голосов
/ 28 мая 2010

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

SELECT TOP(5) BOTTOM(5)

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

Ответы [ 8 ]

22 голосов
/ 28 мая 2010

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

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
8 голосов
/ 28 мая 2010

Проверьте ссылку

SQL SERVER - Как получить TOP и BOTTOM строки вместе, используя 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

7 голосов
/ 28 мая 2010

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

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
3 голосов
/ 28 мая 2010

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

например.

select top 5 ... order by {specify columns asc} 
union 
select top 5 ... order by {specify columns desc}
2 голосов
/ 23 августа 2012

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

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);
1 голос
/ 28 мая 2010

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

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 голос
/ 28 мая 2010

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

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

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

0 голосов
/ 13 декабря 2013

Мне пришлось сделать это недавно для очень большой хранимой процедуры; если ваш запрос довольно большой, и вы хотите минимизировать количество запросов, которые вы можете объявить @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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...