|
Получить случайную строку из выборки
|
|||
---|---|---|---|
#18+
Есть таблица с номерами NUMBERS(num,status), в которой содержится 10к записей. Мне нужно получить из нее один случайный свободный (status=0) номер и закрепить его (status=1) после использования. Не посоветуете, как лучше всего получить одну случайную запись из выборки? Решение "в лоб": Код: plsql 1. 2. 3. 4. 5. 6. 7. 8.
Но намного больше мне нравится такой способ: Код: plsql 1. 2. 3. 4.
Вот только из документации не могу найти информацию, где определяется, какие записи попадут в sample, и попадут ли они туда до where или после. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2019, 17:02 |
|
Получить случайную строку из выборки
|
|||
---|---|---|---|
#18+
Alibek B.получить из нее один случайный свободный (status=0) номер и закрепить его (status=1) после использования. Не туда копаете изначально. Получить И ЗАКРЕПИТЬ одну запись - курсор select for update skip locked, из которого фетчим одну строку с последующим update where current of. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2019, 17:09 |
|
Получить случайную строку из выборки
|
|||
---|---|---|---|
#18+
Alibek B., sample_percent For sample_percent, specify the percentage of the total row or block count to be included in the sample. ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2019, 17:11 |
|
Получить случайную строку из выборки
|
|||
---|---|---|---|
#18+
andrey_anonymousAlibek B.получить из нее один случайный свободный (status=0) номер и закрепить его (status=1) после использования. Не туда копаете изначально. Получить И ЗАКРЕПИТЬ одну запись - курсор select for update skip locked, из которого фетчим одну строку с последующим update where current of. Ах да, случайную... Ну отсортируйте табличку посредством insert into ... select from ...order by dbms_random.value, 10к строк - мелочь. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2019, 17:12 |
|
Получить случайную строку из выборки
|
|||
---|---|---|---|
#18+
andrey_anonymous, он хочет чтоб селект вернул одну "очень" случайную запись ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2019, 17:14 |
|
Получить случайную строку из выборки
|
|||
---|---|---|---|
#18+
Alibek B.попадут ли они туда до where или после. До. sample - не фильтр, это часть query_table_expression ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2019, 17:14 |
|
Получить случайную строку из выборки
|
|||
---|---|---|---|
#18+
Staxон хочет чтоб селект вернул одну "очень" случайную запись ну дык ить и будет "случайная", ежели записи хранятся в хаотичном порядке. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2019, 17:15 |
|
Получить случайную строку из выборки
|
|||
---|---|---|---|
#18+
andrey_anonymousStaxон хочет чтоб селект вернул одну "очень" случайную запись ну дык ить и будет "случайная", ежели записи хранятся в хаотичном порядке. оно как-бы теоретически без ордер бай и так случайно выбирает, но на практике в более менее постоянном порядке напр надо разыграть приз (случайному клиенту), если без dbms_random, то счасливчик буде более менее один и тот же (напр из первого блока) ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2019, 17:21 |
|
Получить случайную строку из выборки
|
|||
---|---|---|---|
#18+
Alibek B.Вот только из документации не могу найти информацию, где определяется, какие записи попадут в sample, и попадут ли они туда до where или после. из доки https://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_10002.htm#SQLRF01702 sample_clause The sample_clause lets you instruct the database to select from a random sample of data from the table, rather than from the entire table. .... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2019, 17:26 |
|
Получить случайную строку из выборки
|
|||
---|---|---|---|
#18+
Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32.
Staxнапр надо разыграть приз (случайному клиенту) В этом случае Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2019, 17:38 |
|
Получить случайную строку из выборки
|
|||
---|---|---|---|
#18+
andrey_anonymousВ этом случае нету в табличке сквозного num ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2019, 17:49 |
|
Получить случайную строку из выборки
|
|||
---|---|---|---|
#18+
Staxandrey_anonymousВ этом случае нету в табличке сквозного num Что это меняет? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2019, 17:53 |
|
Получить случайную строку из выборки
|
|||
---|---|---|---|
#18+
Собственно, еще раз, для полноты изложения: - если несколько параллельных процессов должны обрабатывать набор данных, отбирая по одной записи - см. метод с for update skip locled - если надо всего лишь выбрать пару-тройку "призеров" - то проще всего генерировать случайный ключ и делать probe. Генерацию ключа можно заменить генерацией случайного rowid, если чуть напрячься и построить карту экстентов таблицы. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2019, 17:56 |
|
Получить случайную строку из выборки
|
|||
---|---|---|---|
#18+
andrey_anonymousЧто это меняет? что кодировать взамест and num = round(dbms_random.value(1,10e3))? .... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2019, 17:57 |
|
Получить случайную строку из выборки
|
|||
---|---|---|---|
#18+
Staxandrey_anonymousЧто это меняет? что кодировать взамест and num = round(dbms_random.value(1,10e3))? Верхнюю и нижнюю границу num. Для сильно разреженных данных можно либо пронумеровать строки, либо генерировать rowid. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2019, 18:07 |
|
Получить случайную строку из выборки
|
|||
---|---|---|---|
#18+
andrey_anonymousВерхнюю и нижнюю границу num. Для сильно разреженных данных можно либо пронумеровать строки, либо генерировать rowid. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2019, 18:14 |
|
Получить случайную строку из выборки
|
|||
---|---|---|---|
#18+
Alibek B., update numbers set status=1 where status=0 and rownum=1 ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2019, 19:20 |
|
Получить случайную строку из выборки
|
|||
---|---|---|---|
#18+
-2-update numbers set status=1 where status=0 and rownum=1 Само собой, только добавить returning into. Ну тут нет случайности. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2019, 19:25 |
|
Получить случайную строку из выборки
|
|||
---|---|---|---|
#18+
andrey_anonymous, добавте в вывод колличество спроб я не спорю и ничего не доказываю но имхо order by dbms_random.value самый лучий вариант .... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2019, 19:41 |
|
Получить случайную строку из выборки
|
|||
---|---|---|---|
#18+
Сортировать 10к строк, чтобы получить из них одну случайную? Как-то это выглядит не очень. Тогда уж лучше вообще не сортировать, а вместо rownum=1 написать rownum=(select count from numbers where status=1) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2019, 20:02 |
|
Получить случайную строку из выборки
|
|||
---|---|---|---|
#18+
Alibek B.Ну тут нет случайности.В оракле нет штатных средств получения случайности. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2019, 20:20 |
|
Получить случайную строку из выборки
|
|||
---|---|---|---|
#18+
Сортировать 10к коротких строк - мелочь, вообще говоря, если не сто-двести-тысячу раз в секунду. Но Вы так и не озвучили задачу, для решения которой захотелось странного. Alibek B.вместо rownum=1 написать rownum=(select count from numbers where status=1) И что будет? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2019, 20:39 |
|
Получить случайную строку из выборки
|
|||
---|---|---|---|
#18+
Регистрируются клиенты, получают уникальный номер и затем используют этот номер в разных местах. Если эти номера будут не случайными, а последовательными, то это будет нежелательным. Планируются сценарии типа "подарок каждому сотому клиенту" и последовательная нумерация будет приводить к попыткам манипулирования. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2019, 22:32 |
|
Получить случайную строку из выборки
|
|||
---|---|---|---|
#18+
andrey_anonymousИ что будет? По идее - я выберу не первую строку перемешанной выборки, а случайную строку не перемешанной выборки. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2019, 22:34 |
|
Получить случайную строку из выборки
|
|||
---|---|---|---|
#18+
andrey_anonymousСортировать 10к коротких строк - мелочь Не только сортировать - вначале сгенерировать 10к случайных значений, а затем их сортировать. Сгенерировать одно случайное значение и отфильтровать по нему кажется более оптимальным. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2019, 22:38 |
|
|
start [/forum/topic.php?fid=52&msg=39852269&tid=1882161]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
26ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
others: | 17ms |
total: | 136ms |
0 / 0 |