Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > СУБД, общие вопросы > Случайная выборка строки из БД Sybase 12.5


Автор: VSergeyV 5.9.2006, 06:49
Нужно, делать случайную выборку из БД /Sybase 12.5/ одной строки /для конкурса, определение победителей/
В MySQL проходит такая штука, причем об этом написано даже в мануале к нему /Следует учитывать, что оператор RAND() в выражении WHERE при выполнении выражения WHERE будет вычисляться каждый раз заново/
Код

SELECT * FROM table WHERE 1=1 ORDER BY RAND() LIMIT 1

Либо так даже
Код

SELECT * FROM table ORDER BY RAND() LIMIT 1


В Sybase 12.5 это не проходит, т.к. как я понял значение RAND() для запроса вычисляется единожды

Пример
Код

SELECT Phone,rand() FROM mod_happy_ticket WHERE Phone>0 ORDER BY RAND()


Результат

Phone               rand() 
789777    .98420166176939461
789777    .98420166176939461
789777    .98420166176939461
789777    .98420166176939461
789777    .98420166176939461
789777    .98420166176939461
789777    .98420166176939461
789777    .98420166176939461
789777    .98420166176939461
79139166670    .98420166176939461


Как нибудь, в Субасе можно сделать это??? В виде хранимой процедуры...

Автор: chief39 5.9.2006, 14:23
Цитата(VSergeyV @  5.9.2006,  06:49 Найти цитируемый пост)
SELECT * FROM table WHERE 1=1 ORDER BY RAND() LIMIT 1

 - Не совсем понятно зачем 1=1 добавил на ровном месте.
 - И... интересный вариант выбора "случайной строки" smile - сортировка по непонятному полю.
Количество "случайных вариантов" = количеству столбцов. Небольшой разброс значений однако....

Чесс говоря, не помню уже, но, кажется, есть ранд с параметром.

Да... вот не помню, если в селекте указать
Код

select @tmp_var = field1
from bla-bla...

кажется, выберется последняя запись.
Можно просто ставить роукаунт по рандому(до количества строк в таблице), делать выборку, получать айди строки в переменную и выбирать уже целенаправленно по айди одну нашу строку

надо уточнить:
 - rand(param) и
 - порядок строк в select @tmp_var = field1

Автор: DrDred 15.9.2006, 12:17
Можно так вот поступить (для выборки одной строки)
Код

declare @rnd_id int
select @rnd_id = max(id) from <table>
select @rnd_id = @rnd_id * rand() 

-- если мы через random не попадаем точно на id записи, выбираем ближайшую
set rowcount 1

select * from <table> order by @rnd_id - id

set rowcount 0


Автор: VSergeyV 26.9.2006, 13:29
Я меня еще не только выборка случаной строки из БД, но и еще по условию, а точнее по диапозону дат

вообщем у меня сейчас так
Код

CREATE PROCEDURE dbo.mod_happy_ticket_HReg 
( 
    @startdate DateTime,
    @finishdate DateTime   
) 
AS 
BEGIN 
   set rowcount 1
   select t.IdRegistration, Phone, (select rand(t.IdRegistration)+t.phone) RandomNumber from mod_happy_ticket t WHERE t.datetime>@startdate AND t.datetime<@finishdate ORDER BY RandomNumber
END



Все работает, вот, правдо при многократных запусках на неизменном наборе данных получается. одна и таже строка, т.е. как бы не рандомайза, но мне этого и не требуется
Вопросы
1) DrDred пишет в листинге в конце 
Код
set rowcount 0
 Т.е. надо сбрасывать
2) При больших значения IdRegistration 
Код
rand(t.IdRegistration)
 переполнения не будет ранда?

Автор: chief39 26.9.2006, 16:23
Цитата(VSergeyV @  26.9.2006,  13:29 Найти цитируемый пост)
2) При больших значения IdRegistration 
Выделить всёкод SQL
1:
    
rand(t.IdRegistration)
 переполнения не будет ранда? 

Погляди что принимает ранд. И какой у тебя IdRegistration.
А заодно проверь вручную smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)