powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / случайный выбор строк
10 сообщений из 10, страница 1 из 1
случайный выбор строк
    #34847129
PsM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть таблица t.
у каждой строки есть поле freq которое характеризиет как часто строка должна выбираться
есть поле cnt которое хранит количество раз которое данная строка выбиралась

нужно случайным образо выбирать одну/несколько строк в соответсвии с полем freq
в идеале cnt/(select sum(cnt) from t) должно совпадать с freq/(select sum(freq) from t) для каждой строки

подскажите пожалуйста как можно сделать такое ...
...
Рейтинг: 0 / 0
случайный выбор строк
    #34847829
Andrey Daeron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PsMесть таблица t.
у каждой строки есть поле freq которое характеризиет как часто строка должна выбираться
есть поле cnt которое хранит количество раз которое данная строка выбиралась

нужно случайным образо выбирать одну/несколько строк в соответсвии с полем freq
в идеале cnt/(select sum(cnt) from t) должно совпадать с freq/(select sum(freq) from t) для каждой строки

подскажите пожалуйста как можно сделать такое ...

Ну что-то по типу:
Код: plaintext
1.
2.
3.
4.
BEGIN;
SELECT ...INTO TempTable FROM t WHERE  (F(random(),freq)= 1 );
UPDATE t SET cnt=cnt+ 1  WHERE id in (select id from TempTable);
COMMIT;
Где F -это некая функция опреедляющая случилось или не случилось
если freq - от 0 до 1 то это может быть простое ">" (ну или "<").

Естественно это можно оформить в хранимку, а то и вообще в руль для удобства.
...
Рейтинг: 0 / 0
случайный выбор строк
    #34849053
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дайте ТОЧНУЮ формулировку задачи

PsMнужно случайным образо выбирать одну/несколько строкзадача: "выбрать три строки", то есть вернуть надо ровно три строки?

или задача "выбрать сколько-нибудь строк - одну/несколько/ни_одной - сколько получиться"? (решение Andrey Daeron)

выборка заданного кол-ва строк больше одной - при этом одну и ту же строку можно вернуть в нескольких экземплярах?
...
Рейтинг: 0 / 0
случайный выбор строк
    #34850421
PsM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeXa NalBatдайте ТОЧНУЮ формулировку задачи

PsMнужно случайным образо выбирать одну/несколько строкзадача: "выбрать три строки", то есть вернуть надо ровно три строки?

или задача "выбрать сколько-нибудь строк - одну/несколько/ни_одной - сколько получиться"? (решение Andrey Daeron)


выборка заданного кол-ва строк больше одной - при этом одну и ту же строку можно вернуть в нескольких экземплярах?
нужно выбирать заданное количество строк, без нескольких экземляров одной и тойже строки
если несколько строк вернуть проблематично, тогда хотябы одну
...
Рейтинг: 0 / 0
случайный выбор строк
    #34850545
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PsMнужно выбирать заданное количество строк, без нескольких экземляров одной и тойже строкине получится. допустим в таблице всего две строки A и B с freq_A=1 и freq_B=2. приходят только запросы "выбрать случайным образом две строки". тогда каждый раз будут выдаваться эти две строки, то есть получится cnt_A=cnt_B. условие задачи "в идеале cnt/(select sum(cnt) from t) должно совпадать с freq/(select sum(freq) from t) для каждой строки" не выполняется.

PsMесли несколько строк вернуть проблематично, тогда хотябы однуимхо, проблематичнее :)
...
Рейтинг: 0 / 0
случайный выбор строк
    #34851036
Andrey Daeron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PsM
нужно выбирать заданное количество строк, без нескольких экземляров одной и тойже строки
если несколько строк вернуть проблематично, тогда хотябы одну
Может укажете более полно предметную область? В такой формулировке LeXa NalBat совершенно правильно привел контр-пример. Т.е. постановка противоречива
...
Рейтинг: 0 / 0
случайный выбор строк
    #34853315
PsM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeXa NalBat PsMнужно выбирать заданное количество строк, без нескольких экземляров одной и тойже строкине получится. допустим в таблице всего две строки A и B с freq_A=1 и freq_B=2. приходят только запросы "выбрать случайным образом две строки". тогда каждый раз будут выдаваться эти две строки, то есть получится cnt_A=cnt_B. условие задачи "в идеале cnt/(select sum(cnt) from t) должно совпадать с freq/(select sum(freq) from t) для каждой строки" не выполняется.

Осмыслил... да Вы правы.
Дубликаты, не только допустимы, но в случае необходимости должны выходить ...
...
Рейтинг: 0 / 0
случайный выбор строк
    #34853583
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PsMесть таблица t.
у каждой строки есть поле freq которое характеризиет как часто строка должна выбираться
есть поле cnt которое хранит количество раз которое данная строка выбиралась

нужно случайным образо выбирать одну/несколько строк в соответсвии с полем freq
в идеале cnt/(select sum(cnt) from t) должно совпадать с freq/(select sum(freq) from t) для каждой строкиесли я правильно помню теорвер, то практически всегда "на практике" существует отклонение выпадений случайной величины от матожидания (того, что "в идеале"), и пропорционально оно корню из числа выборок. Если вы считаете таковое отклонение недопустимым - и тогда задача решаема, но величина перестает быть "случайной" (последующие выборки берутся зависимыми от предыдущих). Т.е. вопрос еще и в том, что вы считаете эквивалентом формулировки "в идеале" - "случайная, с матожиданием ткаким-то" или что-то иное.
...
Рейтинг: 0 / 0
случайный выбор строк
    #34853731
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
добавить поле int_freq = sum(freq) where id>id
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
create table t1 ( id integer, freq real, int_freq real );
insert into t1 values(  1 ,  0 . 5 ,  0 . 5  );
insert into t1 values(  2 ,  0 . 5 ,  1  );
insert into t1 values(  3 ,  1 ,  2  );
insert into t1 values(  4 ,  0 . 5 ,  2 . 5  );
create index i1_id on t1 ( id );
create index i1_int_freq on t1 ( int_freq );

create function f1(integer) returns setof float language 'sql'
as 'select random() from generate_series(1,$1)' volatile;

select * from f1( 3 ) join t1 on (  f1.f1 * (select max(int_freq) from t1)
between t1.int_freq-t1.freq and t1.int_freq ) order by id;

drop function f1(integer);
drop table t1;
...
Рейтинг: 0 / 0
случайный выбор строк
    #34868321
PsM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeXa NalBat
Код: plaintext
1.
2.
select * from f1( 3 ) join t1 on (  f1.f1 * (select max(int_freq) from t1)
between t1.int_freq-t1.freq and t1.int_freq ) order by id;


Только нужно
Код: plaintext
1.
select * from f1( 3 ) join t1 on
(  f1.f1 * (select max(int_freq) from t1) >= t1.int_freq-t1.freq and (  f1.f1 * (select max(int_freq) from t1)< t1.int_freq order by id; 
потому что если случайное значение попадет на границу диапазона ( t1.int_freq-t1.freq, t1.int_freq ) то выбереться два значение вместо одного...
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / случайный выбор строк
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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