Здравствуйте wp, Вы писали:
wp>Как выбрать из таблицы n случайных строк. (не кусок таблицы, а именно случайных)?
в чистом виде, на SQL — никак. Искусственно — можно. например, если столбец id является уникальным ключем, то можно сделать что-то типа
SELECT TOP n * FROM Table WHERE Right(convert(id, varchar), 1)='0'
Здравствуйте wp, Вы писали:
wp>Как выбрать из таблицы n случайных строк. (не кусок таблицы, а именно случайных)?
Есть несколько вариантов.
1) Если у тебя есть числовой ключ и ты знаешь его текущий диапазон значений (всегда можно получиться черз select min(id), max(id) ...), то можно сгенерировать случайное значение и сделать select distinct ... where id >= random. Работать будет быстро, но единственный минус — невозможно управлять распределением, т.к. в ключе могут быть дырки.
2) Открываешь всю таблицу в курсоре с абсолютным позиционированием. Генерируешь случайное смещение, делаешь фетч записи по этому смещению. Работать будет медленнее, чем 1), но зато можно сгенерировать произвольное распределение.
Здравствуйте wp, Вы писали:
wp>Как выбрать из таблицы n случайных строк. (не кусок таблицы, а именно случайных)?
Если основная задача — сократить объем обработки для создания статистики равномерно по всем строкам таблицы, то (положившись на хаотичный порядок следования строк) открыть курсор и пройтись по таблице с
FETCH RELATIVE <n> ...
1/n = доля рассматриваемых строк.
Для пущей случайности можно предварительно спозиционировать курсор на запись со случайным абсолютным смещением в диапазоне от 1 до n.
Здравствуйте wp, Вы писали:
wp>Как выбрать из таблицы n случайных строк. (не кусок таблицы, а именно случайных)?
Если на MS SQL, то можно попробовать так:
SELECT DISTINCT TOP 3 a.ID, a.Name FROM table1 as a INNER JOIN
(SELECT CAST(RAND(DatePart(mm, getdate())*100000 + DatePart(ss,getdate())*2000
+DatePart(ms, getdate()) as int) as random_value FROM table1 as c GROUP BY ID) as b
ON a.ID=b.random_value
Вместо TOP 3 можно поставить нужную чиселку (n), а множители у слагаемых частей даты
подобрать по вкусу. Ну и разные комбинации полей или таблиц — в общем, это просто идея,
вам может быть виднее как лучше сделать, я не анализировал насколько равномерно распределяются числа.
Успехов!
К этому моменту у меня внутри 0.5, 0.7, 0.33 (с) НС