Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Случайная строка из таблицы, NEWID() и RAND()  [new]
b00ring
Member

Откуда:
Сообщений: 59
Для получения случайной строки использую например такой код:
select top 1 name, newid()
from sys.all_objects
order by 2


Почему, если заменить newid() на rand(), то перестает работать?

select top 1 name, rand() 
from sys.all_objects
order by 2
6 дек 13, 14:03    [15252975]     Ответить | Цитировать Сообщить модератору
 Re: Случайная строка из таблицы, NEWID() и RAND()  [new]
iap
Member

Откуда: Москва
Сообщений: 47063
b00ring,

смотрите BOL. Там сказано, что RAND() вырабатывает одно случайное число на весь запрос.
NEW_ID() вырабатывает значение для каждой строки.
В одном из обсуждений на этом форуме выяснили, что при вычислении GUID используется
генератор псевдослучайных чисел.
6 дек 13, 14:19    [15253126]     Ответить | Цитировать Сообщить модератору
 Re: Случайная строка из таблицы, NEWID() и RAND()  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10232
Блог
ещё можно заюзать
crypt_gen_random()
6 дек 13, 14:38    [15253301]     Ответить | Цитировать Сообщить модератору
 Re: Случайная строка из таблицы, NEWID() и RAND()  [new]
aleks2
Guest
b00ring
Для получения случайной строки использую например такой код:
select top 1 name, newid()
from sys.all_objects
order by 2


Почему, если заменить newid() на rand(), то перестает работать?

select top 1 name, rand() 
from sys.all_objects
order by 2


Патамушто это говнокод, в обоих вариантах. Вынуждающий сервер сканировать ВСЮ таблицу.

Надо так:

select *
from aTable
where rowNumber = ceil( rand()*totalRowsCount )
7 дек 13, 08:23    [15257115]     Ответить | Цитировать Сообщить модератору
 Re: Случайная строка из таблицы, NEWID() и RAND()  [new]
MX_User
Member

Откуда:
Сообщений: 27
aleks2, идите в ветку с oracle
b00ring,
Что бы не читать всю талицу:
SELECT TOP (1) * FROM sys.all_objects TABLESAMPLE (100 ROWS)
7 дек 13, 16:41    [15258178]     Ответить | Цитировать Сообщить модератору
 Re: Случайная строка из таблицы, NEWID() и RAND()  [new]
aleks2
Guest
MX_User
aleks2, идите в ветку с oracle
b00ring,
Что бы не читать всю талицу:
SELECT TOP (1) * FROM sys.all_objects TABLESAMPLE (100 ROWS)


1. Не учите меня жить и не узнаете куда вам следует пойти.
2. Еще один пример говнокода.
7 дек 13, 17:11    [15258273]     Ответить | Цитировать Сообщить модератору
 Re: Случайная строка из таблицы, NEWID() и RAND()  [new]
Exproment
Member

Откуда:
Сообщений: 416
aleks2
2. Еще один пример говнокода.

aleks2
select *
from aTable
where rowNumber = ceil( rand()*totalRowsCount )

Расшифруйте свой код.
  • totalRowsCount откуда берется ?
  • rowNumber = суррогатный ключ ?
  • ceil = ceiling ?
  • 7 дек 13, 19:53    [15258702]     Ответить | Цитировать Сообщить модератору
     Re: Случайная строка из таблицы, NEWID() и RAND()  [new]
    Mnior
    Member

    Откуда: Кишинёв
    Сообщений: 6723
    aleks2
    2. Еще один пример говнокода.
    Почему?
    8 дек 13, 06:45    [15259888]     Ответить | Цитировать Сообщить модератору
     Re: Случайная строка из таблицы, NEWID() и RAND()  [new]
    aleks2
    Guest
    Mnior
    aleks2
    2. Еще один пример говнокода.
    Почему?

    Патамушто тредстартеру нужна 1 (ОДНА) случайная строка.
    Ну и, вангую я, с предсказуемым распределением вероятности.
    8 дек 13, 10:12    [15259965]     Ответить | Цитировать Сообщить модератору
     Re: Случайная строка из таблицы, NEWID() и RAND()  [new]
    MX_User
    Member

    Откуда:
    Сообщений: 27
    Exproment
    Расшифруйте свой код.
  • totalRowsCount откуда берется ?
  • rowNumber = суррогатный ключ ?
  • ceil = ceiling ?

  • Не слушай ты его, он привел пример на PL\SQL (oracle) и еще чего-то умничает
    9 дек 13, 11:44    [15263410]     Ответить | Цитировать Сообщить модератору
     Re: Случайная строка из таблицы, NEWID() и RAND()  [new]
    aleks2
    Guest
    MX_User
    Exproment
    Расшифруйте свой код.
  • totalRowsCount откуда берется ?
  • rowNumber = суррогатный ключ ?
  • ceil = ceiling ?

  • Не слушай ты его, он привел пример на PL\SQL (oracle) и еще чего-то умничает


    1. Я и не знал, что знаю PL\SQL (oracle). Здорово. Буду знать.
    2. Пронумеровать и посчитать строки является правильным направлением мысли, ибо обеспечивает возможность выбора строки с минимальными накладными расходами и контролируемым распределением вероятности.
    3. Ну а некоторые неточности в названиях функций вполне простительны.
    9 дек 13, 13:04    [15264095]     Ответить | Цитировать Сообщить модератору
     Re: Случайная строка из таблицы, NEWID() и RAND()  [new]
    MX_User
    Member

    Откуда:
    Сообщений: 27
    aleks2
    1. Я и не знал, что знаю PL\SQL (oracle). Здорово. Буду знать.

    Ну уж MS SQL точно не знаешь
    9 дек 13, 13:33    [15264331]     Ответить | Цитировать Сообщить модератору
     Re: Случайная строка из таблицы, NEWID() и RAND()  [new]
    aleks2
    Guest
    MX_User
    aleks2
    1. Я и не знал, что знаю PL\SQL (oracle). Здорово. Буду знать.

    Ну уж MS SQL точно не знаешь

    Хе-хе?!
    Чья бы корова мычала... с восемью то сообщениями.
    https://www.sql.ru/forum/actualsearch.aspx?search=&sin=0&bid=1&a=aleks2&ma=1&dt=-1&s=1&so=1
    9 дек 13, 15:08    [15265032]     Ответить | Цитировать Сообщить модератору
     Re: Случайная строка из таблицы, NEWID() и RAND()  [new]
    Exproment
    Member

    Откуда:
    Сообщений: 416
    aleks2, наглости у вас и правда хоть отбавляй
    Сравняли с говном несколько приведенных решений, забыв про аргументы как сущность. И не ответив на конкретные вопросы по своему решению продолжать дискуссию. Теперь вангую я:
    aleks2
    Патамушто это говнокод, в обоих вариантах. Вынуждающий сервер сканировать ВСЮ таблицу.

    В вашем примере посчитать totalRowsCount(если это переменная) - первое сканирование таблицы.
    Пронумеровать все записи - второе сканирование таблицы.
    10 дек 13, 14:32    [15271479]     Ответить | Цитировать Сообщить модератору
     Re: Случайная строка из таблицы, NEWID() и RAND()  [new]
    aleks2
    Guest
    Exproment
    aleks2, наглости у вас и правда хоть отбавляй
    Сравняли с говном несколько приведенных решений, забыв про аргументы как сущность. И не ответив на конкретные вопросы по своему решению продолжать дискуссию. Теперь вангую я:
    aleks2
    Патамушто это говнокод, в обоих вариантах. Вынуждающий сервер сканировать ВСЮ таблицу.

    В вашем примере посчитать totalRowsCount(если это переменная) - первое сканирование таблицы.
    Пронумеровать все записи - второе сканирование таблицы.


    1. (select max(rowNumber) from aTable) = одно обращение к индексу.
    2. Ты ж, надеюсь, не собираешься нумеровать их перманентно?
    3. Учись, студент.
    10 дек 13, 19:42    [15273613]     Ответить | Цитировать Сообщить модератору
     Re: Случайная строка из таблицы, NEWID() и RAND()  [new]
    Exproment
    Member

    Откуда:
    Сообщений: 416
    aleks2,
    aleks2
    3. Учись, студент.

    ну что-то типа этого я и ожидал от вас
    aleks2
    2. Ты ж, надеюсь, не собираешься нумеровать их перманентно?

    исходя из чего вы сделали такое предложение ? Вроде ясно написал "Пронумеровать все записи - второе сканирование таблицы."
    aleks2
    1. (select max(rowNumber) from aTable) = одно обращение к индексу.

    это что ? вы мне показали как выбрать из таблицы максимальное значение ? Спасибо! Правда вроде как ранее был такой код(все еще не расшифрован):
    aleks2
    select *
    from aTable
    where rowNumber = ceil( rand()*totalRowsCount )
    

    ЗЫ: складывается ощущение, что разъяснений от вас не добиться... и легче забить :) Вы вправе и дальше считать всех вокруг себя говном :)
    10 дек 13, 21:25    [15273987]     Ответить | Цитировать Сообщить модератору
     Re: Случайная строка из таблицы, NEWID() и RAND()  [new]
    alexeyvg
    Member

    Откуда: Moscow
    Сообщений: 31816
    Exproment
    ЗЫ: складывается ощущение, что разъяснений от вас не добиться... и легче забить :)
    Да неработающий это вариант, сразу же видно. Не знаю, зачем aleks2 это пишет.

    Понятно, что никакого rowNumber у таблицы нет, иначе бы вопрос не возникал, использование ранжирующих функций будет эквивалентна скану. Так что ничего лучше order by newid() не придумать, разве что распределение будет более правильным, всё таки newid() не предназначена для получения случайного числа.
    10 дек 13, 21:49    [15274034]     Ответить | Цитировать Сообщить модератору
     Re: Случайная строка из таблицы, NEWID() и RAND()  [new]
    aleks2
    Guest
    alexeyvg
    Да неработающий это вариант, сразу же видно. Не знаю, зачем aleks2 это пишет.

    Понятно, что никакого rowNumber у таблицы нет, иначе бы вопрос не возникал, использование ранжирующих функций будет эквивалентна скану. Так что ничего лучше order by newid() не придумать, разве что распределение будет более правильным, всё таки newid() не предназначена для получения случайного числа.


    1. Иногда человеческая глупость поражает.
    2. Да, "rowNumber у таблицы нет". Но кто те мешает его сделать?
    3. Да, его (rowNumber) надо заполнить ОДИН РАЗ и поддерживать, если в таблицу добавляются/убавляются строки.
    4. Зато не надо сканировать и сортировать огромные массивы данных при КАЖДОМ запросе строки.
    5. Но я не запрещаю вам пользоваться order by newid(), коль ничего слаще репы вам кушать не доводилось.
    11 дек 13, 05:41    [15274580]     Ответить | Цитировать Сообщить модератору
     Re: Случайная строка из таблицы, NEWID() и RAND()  [new]
    Сон Веры Павловны
    Member

    Откуда:
    Сообщений: 6149
    aleks2
    3. Да, его (rowNumber) надо заполнить ОДИН РАЗ и поддерживать, если в таблицу добавляются/убавляются строки.

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

    Это результат вангования?
    aleks2
    коль ничего слаще репы вам кушать не доводилось.

    Лучшее - враг хорошего.
    11 дек 13, 06:20    [15274596]     Ответить | Цитировать Сообщить модератору
     Re: Случайная строка из таблицы, NEWID() и RAND()  [new]
    aleks2
    Guest
    Сон Веры Павловны
    aleks2
    3. Да, его (rowNumber) надо заполнить ОДИН РАЗ и поддерживать, если в таблицу добавляются/убавляются строки.

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

    Это результат вангования?
    aleks2
    коль ничего слаще репы вам кушать не доводилось.

    Лучшее - враг хорошего.


    1. Репы хватит на всех.
    2. Выбор случайной строки из таблицы - это вполне определенные системы. Типо "тестирование".
    3. Нету там потока данных в таблицу. Есть только выборки.

    ЗЫ. Поддержка непрерывной нумерации в многопользовательской среде - тривиальная задача.
    11 дек 13, 08:03    [15274699]     Ответить | Цитировать Сообщить модератору
     Re: Случайная строка из таблицы, NEWID() и RAND()  [new]
    invm
    Member

    Откуда: Москва
    Сообщений: 9683
    Недавно обсуждалось - Рандомная выборка

    Правда и там aleks2 не смог продемонстрировать свой работающий вариант, который не "фуфло"
    11 дек 13, 11:00    [15275526]     Ответить | Цитировать Сообщить модератору
     Re: Случайная строка из таблицы, NEWID() и RAND()  [new]
    aleks2
    Guest
    invm
    Недавно обсуждалось - Рандомная выборка

    Правда и там aleks2 не смог продемонстрировать свой работающий вариант, который не "фуфло"


    Смысл демонстрировать тебе то, что выше твоего уровня?
    Т.е. то, что ты неспособен понять.
    11 дек 13, 11:46    [15275862]     Ответить | Цитировать Сообщить модератору
     Re: Случайная строка из таблицы, NEWID() и RAND()  [new]
    хмхмхм
    Guest
    Статья в тему:

    http://www.interface.ru/home.asp?artId=35257

    MS SQL: генерация псевдослучайных данных с использованием newID(). Возможности и подводные камни
    11 дек 13, 11:50    [15275903]     Ответить | Цитировать Сообщить модератору
     Re: Случайная строка из таблицы, NEWID() и RAND()  [new]
    angel_zar
    Member

    Откуда: Барнаул
    Сообщений: 902
    Declare @Rows integer
    
    select @Rows=count(*) from sys.all_objects
    
    ;with CTE (num, name) as
    (select ROW_NUMBER() over (order by (select 1)) as num,name
    from sys.all_objects
    )
    
    select * from CTE
    where num=ROUND(((@Rows-1)*RAND()+1),0)
    
    select top 1 name, newid()
    from sys.all_objects
    order by 2
    


    И сравните планы
    11 дек 13, 11:54    [15275939]     Ответить | Цитировать Сообщить модератору
     Re: Случайная строка из таблицы, NEWID() и RAND()  [new]
    invm
    Member

    Откуда: Москва
    Сообщений: 9683
    aleks2
    Смысл демонстрировать тебе то, что выше твоего уровня?
    Т.е. то, что ты неспособен понять.
    Другого от тебя и не ожидалось
    Привычный "детский сад с барабаном" от aleks2
    11 дек 13, 11:56    [15275957]     Ответить | Цитировать Сообщить модератору
    Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
    Все форумы / Microsoft SQL Server Ответить