SQL выберите образец строк - PullRequest
4 голосов
/ 20 июня 2010

Мне нужно выбрать строки выборки из набора. Например, если мой запрос на выборку возвращает x строк, то, если x больше 50, я хочу вернуть только 50 строк, а не только первые 50, но 50, которые равномерно распределены по набору результатов. В таблице в этом случае записываются маршруты - GPS местоположения + DateTime. Я заказываю на DateTime и мне нужна разумная выборка значений широты и долготы. заранее спасибо [SQL Server 2008]

Ответы [ 4 ]

3 голосов
/ 20 июня 2010

Чтобы получить примеры строк в SQL Server, используйте этот запрос:

SELECT TOP 50 * FROM Table
ORDER BY NEWID();

Если вы хотите получить каждой n-й строки (10-й в этом примере), попробуйте этот запрос:

SELECT * From 
(
  SELECT  *, (Dense_Rank() OVER (ORDER BY Column ASC)) AS Rank 
  FROM Table
) AS Ranking 
WHERE Rank % 10 = 0; 

Источник

Дополнительные примеры запросов, выбирающих случайные строки для других популярных СУБД, можно найти здесь: http://www.petefreitag.com/item/466.cfm

3 голосов
/ 20 июня 2010

Каждый n-й ряд, чтобы получить 50:

SELECT *
FROM table
WHERE row_number() over() MOD (SELECT Count(*) FROM table) / 50 == 0
FETCH FIRST 50 ROWS ONLY

А если вам нужна случайная выборка, следуйте ответу jimmy_keen.

UPDATE: Что касается требования для его работы на MS SQL, я думаю, что это должно быть изменено на это (хотя нет MS SQL Server для тестирования):

  SELECT TOP 50 *
   FROM (
     SELECT t.*, row_number() over() AS rn, (SELECT count(*) FROM table) / 50 AS step
     FROM table t
   )
   WHERE rn % step == 0
1 голос
/ 20 июня 2010

Я предлагаю вам добавить вычисляемый столбец в свой набор результатов при выборе, который получен как случайное число, а затем выбрать 50 лучших, отсортированных по этому столбцу. Это даст вам случайную выборку.

Например:

SELECT TOP 50 *, RAND(Id) AS Random
FROM SourceData
ORDER BY Random

где SourceData - ваша исходная таблица данных или представление. Это предполагает T-SQL на SQL Server 2008, кстати. Предполагается также, что в вашем источнике данных есть столбец Id с уникальными идентификаторами. Если ваши идентификаторы очень малы, рекомендуется умножить их на большое целое число, прежде чем передавать их в RAND, например:

RAND(Id * 10000000)
0 голосов
/ 08 июня 2011

Если вам нужен статически правильный образец, то табличный образец - неправильное решение.Хорошее решение, как я описал в здесь на основе статьи Microsoft Research, - создать материализованное представление для вашей таблицы, которое включает дополнительный столбец, такой как CAST (ROW_NUMBER () OVER (...) AS BYTE)Как RAND_COL_, вы можете добавить индекс для этого столбца, а также другие интересные столбцы и получить статистически корректные образцы для ваших запросов довольно быстро.(используя WHERE RAND_COL_ = 1).

...