Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Выбор случайной записи из таблицы
|
|||
|---|---|---|---|
|
#18+
Привет всем! Есть задачка. В таблице T1 есть например 2000 записей. Нужно выбирать случайную запись в зависимости от текущей даты, например, 2001/09/16. Какие будут предложения по решению? Может быть кто то уже сталкивался с этим? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2001, 03:29 |
|
||
|
Выбор случайной записи из таблицы
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2001, 12:53 |
|
||
|
Выбор случайной записи из таблицы
|
|||
|---|---|---|---|
|
#18+
2Glory: Предупреждаю Вас о возможной проблеме с newid(). Тут всё сильно завасит от окружения (аппаратуры, ОС и т.д.). Например, мы сделали та-же, как Вы, и на девелопнрском сервере это работало, а на рабочем - перестало select top 1 newid() as random_id, id from mytable order by random_id выдаёт последовательные номера random_id и order by соответственно всегда по кластерному индексу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2001, 07:17 |
|
||
|
Выбор случайной записи из таблицы
|
|||
|---|---|---|---|
|
#18+
2alexeyvg Проверил каждый вариант 3 раза по 100 (в цикле) на таблице из 123000 записей на 2-х разных серверах(оба SQL2000 SP1, Win2000 AdvServer SP2): без индексов, с кластерным индексом, с некластерным индексом. И во всех случаях не увидел ни того, что newid() выдает значения попорядку(или что вы имели ввиду под "последовательные номера random_id"), ни того, что наличие/отсутствие любого индекса влияло на результаты запроса, хотя в плане выполнения запроса присутствовал объект Index Scan. Не думаю, что аппаратура, ОС и окружение должны как-то влиять на работу функции newid(). PS. А что означает "и order by соответственно всегда по кластерному индексу" ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2001, 08:54 |
|
||
|
Выбор случайной записи из таблицы
|
|||
|---|---|---|---|
|
#18+
По поводу "случайности" GUID'ов, генеримых newid(), уже было обсуждение: http://www.sql.ru/cgi-bin/UltraBoard/UltraBoard.pl?Action=ShowPost&Board=mssql&Post=1097 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2001, 09:55 |
|
||
|
Выбор случайной записи из таблицы
|
|||
|---|---|---|---|
|
#18+
"Не думаю, что аппаратура, ОС и окружение должны как-то влиять на работу функции 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 последовательные, то получается по кластерному индексу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2001, 09:59 |
|
||
|
Выбор случайной записи из таблицы
|
|||
|---|---|---|---|
|
#18+
Очень приятно эта тема привлекла ваш интерес, но хочется еще раз уточнить условия. Вышеприведенные алгоритмы выдают разные записи при каждом выполнении запроса, а нужно выдавать случайную запись в течении всего дня, например - за дату 2001.09.18 выдается запись номер 1554, а за 2001.09.19 - номер 1994, т.е. в течении одних суток запрос должен возвращать одну и ту же случайную запись. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2001, 07:35 |
|
||
|
Выбор случайной записи из таблицы
|
|||
|---|---|---|---|
|
#18+
Что вам мешает вычислить номер записи один раз по расписанию в 00:00:01, записать его в таблицу и в дальнейшем использовать уже готовое значение ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2001, 09:06 |
|
||
|
Выбор случайной записи из таблицы
|
|||
|---|---|---|---|
|
#18+
На самом деле ничего не мешает! , задача ставилась для выяснения вообще возможности создания подобного алгоритма, результат которого был бы частично случайным, т.е. запись должна быть случайной, но постоянной в течении этой даты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2001, 09:19 |
|
||
|
|

start [/forum/topic.php?fid=46&fpage=3544&tid=1825509]: |
0ms |
get settings: |
6ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
32ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
53ms |
get tp. blocked users: |
2ms |
| others: | 221ms |
| total: | 352ms |

| 0 / 0 |
