Как выбрать данные top x data после y строк с SQL Server - PullRequest
9 голосов
/ 29 ноября 2010

Например, у меня есть таблица, которая содержит 10'000 строк. Я хочу выбрать 100 лучших рядов после 500-го ряда. Как я могу сделать это наиболее эффективно.

Запрос необходим для SQL Server 2008


Например, у меня уже есть этот запрос, но мне интересно, есть ли более эффективное решение

SELECT TOP 100 xx
FROM nn 
WHERE cc NOT IN 
   (SELECT TOP 500 cc
      FROM nn ORDER BY cc ASC)

Ответы [ 4 ]

14 голосов
/ 29 ноября 2010

Урок 25: Эффективное разбиение на страницы больших объемов данных

with cte as (
 SELECT ...,
  ROW_NUMBER () OVER (ORDER BY ...) as rn
 FROM ...)
SELECT ... FROM cte 
WHERE rn BETWEEN 500 and 600;
9 голосов
/ 29 ноября 2010
Select T0P 600 * 
from my table
where --whatever condition you want
except
select top 500 * 
from mytable
where --whatever condition you want
3 голосов
/ 29 ноября 2010
SELECT 
  col1,
  col2
FROM (
    SELECT ROW_NUMBER() OVER (
        ORDER BY [t0].someColumn) as ROW_NUMBER,
    col1,
    col2
    FROM [dbo].[someTable] AS [t0]
    ) AS [t1]
WHERE [t1].[ROW_NUMBER] BETWEEN 501 and 600
ORDER BY [t1].[ROW_NUMBER]
2 голосов
/ 29 ноября 2010

Выбор TOP 500, затем объединение TOP 100 с результирующим набором.

Обычно, для того чтобы это стоило, вам нужно иметь некоторые критерии, на которых можно основыватьнужно 500 записей для и только 100 для другого условия.Я предполагаю, что этими условиями являются условие1 для TOP 500 и условие2 для TOP 100, которые вы хотите.Поскольку условия отличаются, это является причиной того, что записи могут не совпадать на основе TOP 100.

select TOP 500 *
    from MyTable
    where -- condition1 -- Retrieving the first 500 rows meeting condition1
union
    select TOP 100 *
        from MyTable
        where -- condition2 -- Retrieving the first 100 rows meeting condition2
-- The complete result set of the two queries will be combined (UNIONed) into only one result set.

РЕДАКТИРОВАТЬ # 1

этоэто не то, что я имел в виду.Я хочу выбрать первые 100 строк, идущие после первой 500-й строки.поэтому выбирая строки 501-600

После вашего комментария я лучше понял, чего вы хотите достичь.Попробуйте это:

WITH Results AS (
    select TOP 600 f.*, ROW_NUMBER() OVER (ORDER BY f.[type]) as RowNumber
        from MyTable f
) select *
    from Results
    where RowNumber between 501 and 600

Помогает ли это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...