powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Выбор случайной записи из таблицы
9 сообщений из 9, страница 1 из 1
Выбор случайной записи из таблицы
    #32014135
Jocy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет всем!
Есть задачка. В таблице T1 есть например 2000 записей. Нужно выбирать случайную запись в зависимости от текущей даты, например, 2001/09/16.
Какие будут предложения по решению? Может быть кто то уже сталкивался с этим?
...
Рейтинг: 0 / 0
Выбор случайной записи из таблицы
    #32014141
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Если неприменно нужно от текущей даты, то вот пример из BOL

"SELECT RAND( (DATEPART(mm, GETDATE()) * 100000 )+ (DATEPART(ss, GETDATE()) * 1000 )+ DATEPART(ms, GETDATE()) )

When you use an algorithm based on GETDATE to generate seed values, RAND can still generate duplicate values if the calls to RAND are made within the interval of the smallest datepart used in the algorithm. This is especially likely if the calls to RAND are included in a single batch. Multiple calls to RAND in a single batch can be executed within the same millisecond, which is the smallest increment of DATEPART. In this case, incorporate a value based on something other than time to generate the seed values."

2. А мне больше по душе такой способ

select a.* from mytable a
inner join(select top 1 newid() as random_id, id from mytable order by random_id) as b
on b.id = a.id
...
Рейтинг: 0 / 0
Выбор случайной записи из таблицы
    #32014168
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Glory: Предупреждаю Вас о возможной проблеме с newid(). Тут всё сильно завасит от окружения (аппаратуры, ОС и т.д.). Например, мы сделали та-же, как Вы, и на девелопнрском сервере это работало, а на рабочем - перестало

select top 1 newid() as random_id, id from mytable order by random_id выдаёт последовательные номера random_id и order by соответственно всегда по кластерному индексу.
...
Рейтинг: 0 / 0
Выбор случайной записи из таблицы
    #32014177
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2alexeyvg
Проверил каждый вариант 3 раза по 100 (в цикле) на таблице из 123000 записей на 2-х разных серверах(оба SQL2000 SP1, Win2000 AdvServer SP2): без индексов, с кластерным индексом, с некластерным индексом. И во всех случаях не увидел ни того, что newid() выдает значения попорядку(или что вы имели ввиду под "последовательные номера random_id"), ни того, что наличие/отсутствие любого индекса влияло на результаты запроса, хотя в плане выполнения запроса присутствовал объект Index Scan.

Не думаю, что аппаратура, ОС и окружение должны как-то влиять на работу функции newid().

PS.
А что означает "и order by соответственно всегда по кластерному индексу" ?
...
Рейтинг: 0 / 0
Выбор случайной записи из таблицы
    #32014186
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По поводу "случайности" GUID'ов, генеримых newid(), уже было обсуждение:

http://www.sql.ru/cgi-bin/UltraBoard/UltraBoard.pl?Action=ShowPost&Board=mssql&Post=1097
...
Рейтинг: 0 / 0
Выбор случайной записи из таблицы
    #32014187
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Не думаю, что аппаратура, ОС и окружение должны как-то влиять на работу функции newid()."
MS гарантирует, что GUID будет разным и не более. GUID формируется из 2-х частей уник. номер компьютера и уник. номер внутри компьютера. Второй может быть случайным числом или последовательным номером. Я встречал оба варианта.

По поводу PS.
При выполнении (select top 1 newid() as random_id, id from mytable order by random_id) сервер берёт данные в порядке физ. расположения, вставляя random_id, и ПОТОМ делает order by. Если random_id последовательные, то получается по кластерному индексу.
...
Рейтинг: 0 / 0
Выбор случайной записи из таблицы
    #32014245
Jocy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Очень приятно эта тема привлекла ваш интерес, но хочется еще раз уточнить условия. Вышеприведенные алгоритмы выдают разные записи при каждом выполнении запроса, а нужно выдавать случайную запись в течении всего дня, например - за дату 2001.09.18 выдается запись номер 1554, а за 2001.09.19 - номер 1994, т.е. в течении одних суток запрос должен возвращать одну и ту же случайную запись.
...
Рейтинг: 0 / 0
Выбор случайной записи из таблицы
    #32014255
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что вам мешает вычислить номер записи один раз по расписанию в 00:00:01, записать его в таблицу и в дальнейшем использовать уже готовое значение ?
...
Рейтинг: 0 / 0
Выбор случайной записи из таблицы
    #32014257
Jocy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На самом деле ничего не мешает! , задача ставилась для выяснения вообще возможности создания подобного алгоритма, результат которого был бы частично случайным, т.е. запись должна быть случайной, но постоянной в течении этой даты.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Выбор случайной записи из таблицы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]