Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Выбор случайной записи из таблицы / 9 сообщений из 9, страница 1 из 1
16.09.2001, 03:29
    #32014135
Jocy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор случайной записи из таблицы
Привет всем!
Есть задачка. В таблице T1 есть например 2000 записей. Нужно выбирать случайную запись в зависимости от текущей даты, например, 2001/09/16.
Какие будут предложения по решению? Может быть кто то уже сталкивался с этим?
...
Рейтинг: 0 / 0
16.09.2001, 12:53
    #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
17.09.2001, 07:17
    #32014168
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор случайной записи из таблицы
2Glory: Предупреждаю Вас о возможной проблеме с newid(). Тут всё сильно завасит от окружения (аппаратуры, ОС и т.д.). Например, мы сделали та-же, как Вы, и на девелопнрском сервере это работало, а на рабочем - перестало

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

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

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

http://www.sql.ru/cgi-bin/UltraBoard/UltraBoard.pl?Action=ShowPost&Board=mssql&Post=1097
...
Рейтинг: 0 / 0
17.09.2001, 09:59
    #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
18.09.2001, 07:35
    #32014245
Jocy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор случайной записи из таблицы
Очень приятно эта тема привлекла ваш интерес, но хочется еще раз уточнить условия. Вышеприведенные алгоритмы выдают разные записи при каждом выполнении запроса, а нужно выдавать случайную запись в течении всего дня, например - за дату 2001.09.18 выдается запись номер 1554, а за 2001.09.19 - номер 1994, т.е. в течении одних суток запрос должен возвращать одну и ту же случайную запись.
...
Рейтинг: 0 / 0
18.09.2001, 09:06
    #32014255
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор случайной записи из таблицы
Что вам мешает вычислить номер записи один раз по расписанию в 00:00:01, записать его в таблицу и в дальнейшем использовать уже готовое значение ?
...
Рейтинг: 0 / 0
18.09.2001, 09:19
    #32014257
Jocy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор случайной записи из таблицы
На самом деле ничего не мешает! , задача ставилась для выяснения вообще возможности создания подобного алгоритма, результат которого был бы частично случайным, т.е. запись должна быть случайной, но постоянной в течении этой даты.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Выбор случайной записи из таблицы / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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