Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как выбрать случайную строчку из выборки?  [new]
teCa
Member

Откуда:
Сообщений: 637
Всем привет. Пишу систему бонусов для игроков. Собственно цель простая, есть список предметов, у каждого предмета есть поле default_price. Чем выше это значение - тем меньше шанс, что он выпадет и наоборот. Вот что я делаю:
declare @RND as int, @Rate_min as int, @Rate_max as int
set @Rate_max=100
set @RND = FLOOR(RAND()*(100-1)+10);
WHILE @RND > 40
BEGIN
	set @Rate_max=@Rate_max+100
	set @RND = FLOOR(RAND()*(100-1)+10);
      CONTINUE
END
set @Rate_min = @Rate_max- 200
select @Rate_min as [Min Rate],@Rate_max as [Max Rate]
select item_id,item_name,default_price from central_store.dbo.resurses where default_price between @Rate_min and @Rate_max


Собственно вот такой результат дает данный скрипт:
[img=
http://rgho.st/784dCLNgp/image.png]

Подскажите, как из конечной выборки мне получить одну случайную строку? И может вообще можно было сделать это проще?
7 июн 16, 14:07    [19267130]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать случайную строчку из выборки?  [new]
teCa
Member

Откуда:
Сообщений: 637
Картинка

К сообщению приложен файл. Размер - 9Kb
7 июн 16, 14:08    [19267137]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать случайную строчку из выборки?  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
teCa
как из конечной выборки мне получить одну случайную строку?

SELECT TOP(1) *
FROM ...
ORDER BY NEWID()
7 июн 16, 14:13    [19267162]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать случайную строчку из выборки?  [new]
teCa
Member

Откуда:
Сообщений: 637
AlanDenton,

спасибо!
7 июн 16, 14:21    [19267210]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать случайную строчку из выборки?  [new]
Guf
Member

Откуда: Новосибирск
Сообщений: 650
teCa
declare @RND as int, @Rate_min as int, @Rate_max as int
set @Rate_max=100
set @RND = FLOOR(RAND()*(100-1)+10);
WHILE @RND > 40
BEGIN
	set @Rate_max=@Rate_max+100
	set @RND = FLOOR(RAND()*(100-1)+10);
      CONTINUE
END
set @Rate_min = @Rate_max- 200
select @Rate_min as [Min Rate],@Rate_max as [Max Rate]
select item_id,item_name,default_price from central_store.dbo.resurses where default_price between @Rate_min and @Rate_max


И может вообще можно было сделать это проще?

Если я правильно уловил суть выкрутасов с циклом - получить случайное, но не очень большое, число кратное 100 в качестве верхней границы- то безусловно можно иначе.
SELECT TOP 1 *
    FROM (SELECT ROUND(MIN([v].[rand_max])*1000, -2) FROM (VALUES (RAND(CHECKSUM(NEWID()))),(RAND(CHECKSUM(NEWID()))),(RAND(CHECKSUM(NEWID()))),(RAND(CHECKSUM(NEWID())))) [v]([rand_max]))[rand]([max])
         INNER JOIN [central_store].[dbo].[resurses] [r] ON [r].[default_price] BETWEEN [rand].[max]-200 AND [rand].[max]
    ORDER BY NEWID()
7 июн 16, 15:31    [19267585]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить