2012-02-29 3 views
0

Предположим, что есть таблица SQL Server 2008, как показано ниже, которая содержит 10 миллионов строк. Одним из полей является Id, так как он идентичен от 1 до 10 миллионов.Выбрать оператор, образец таблицы, равное распределение

CREATE TABLE dbo.Stats 
(
    id  INT IDENTITY(1,1) PRIMARY KEY, 
    field1 INT, 
    field2 INT, 
    ... 
) 

Есть ли эффективный способ, выполнив одно отборное заявление, чтобы получить подмножество этих данных, которая удовлетворяет следующие требования:

  • содержит ограниченное количество строк в наборе результатов, т.е. 100, 200 и т.д.
  • обеспечивает равномерное распределение определенного столбца, а не случайным образом, т.е. столбца ID

Таким образом, в нашем примере, если мы возвращаем 100 строк, результирующий набор горе uld выглядят так:

Row 1 - 100 000 
Row 2 - 200 000 
Row 3 - 300 000 
... 
Row 100 - 10 000 000 

Я хочу избежать использования курсора и сохранить его в отдельной таблице.

ответ

2

Не знаю, как эффективного это будет, но Thie следующий запрос будет возвращать каждый 100000th строки (относительно упорядочения устанавливается id):

SELECT * 
FROM (
    SELECT *, ROW_NUMBER() OVER (ORDER BY id) RN 
    FROM Stats 
) T 
WHERE RN % 100000 = 0 
ORDER BY id 

Поскольку это не зависит от фактических значений id, это будет работать, даже если у вас есть «дыры» в последовательности значений id.

+0

Спасибо, это именно то, что я ищу! – user1106591

1

Что-то вроде этого?

SELECT id FROM dbo..Stats WHERE id % 100000 = 0 

он должен работать, так как вы говорите, что идентификатор идет от 1 до 10 000 000. Если число строк не известно, но количество полученных строк то, что вы знаете, то просто вычислить, что номер 100000 как (если вы хотите, 100 результирующих строк):

SELECT id FROM Stats WHERE (id % (SELECT COUNT(id) FROM Stats)/100) = 0 
+0

Благодарим за ответ, вы указали мне в правильном направлении, я бы назвал как ваши, так и Бранко в качестве ответов! – user1106591

Смежные вопросы