powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Сортировка по RAND()
25 сообщений из 67, страница 1 из 3
Сортировка по RAND()
    #39632094
Фотография barry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Server Version: WI-V3.0.0.32483 Firebird 3.0

SELECT FIRST 20 a.ID, DS.RND
FROM (select FIRST 100
a.id, rand() as RND from articles a order by ID desc) AS DS
JOIN articles a ON a.ID=DS.ID
ORDER BY DS.RND

Делаем сортировку по значению RAND() из внутреннего подзапроса. В колонке RND в плане сортировки полная каша...
В чем смысл - из 100 последних фотографий (по ID) делаем выборку 20 случайных.
Вроде как результат по сути получается, 20 последних фоток вроде как хаотично выбираются, но что с сортировкой по RND? Там ведь явно значение из подзапроса указано, или RAND() повторно срабатывает?
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632127
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barryили RAND() повторно срабатывает?

Да. Не нравится - материализуй резалт-сет.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632176
Фотография barry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovДа. Не нравится - материализуй резалт-сет.

А в чем великий смысл повторного RAND() во внешней обертке? Я интерпретирую это как глюк. Мы же получили значения во внутреннем запросе и извне используем значение поля.
В данном контексте использования результат в принципе устраивает, но у любого будут вопросы - а то ли это на самом деле.
Что значит "материализуй резалт-сет"?
Если внутренний подзапрос будет спрятан во view или процедуре - живое поле тоже будет извне жить своей жизнью?
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632183
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barry> А в чем великий смысл повторного RAND() во внешней обертке? Я интерпретирую это как глюк.

Это не глюк и глубокого смысла/замысла в нём нет, просто
такова реализация. IIRC, это даже задокументировано.

P.S. Кроме того, IIRC вызовов может быть даже 3, а не 2.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632190
Фотография barry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам,
Странно конечно... кому это в голову пришла такая реализация :)
Хотя я получил подтверждение что это все таки рандомная выборка/сортировка. Но предсказуемая не так, как бы подумалось. С двойной непредсказуемостью.... или я еще что-то упустил...
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632191
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barry,

в процедуре точно не будет.

Материализовать результат в запросе можно как то так

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
WITH T
AS (SELECT
        a.ID
    FROM
        articles a
    ORDER BY A.ID DESC
    FETCH FIRST 100 ROWS ONLY)
SELECT
    a.ID, DS.RND
FROM
    (SELECT
         ID,
         RAND() AS RND,
         -- оконная функция заставляет материализовасться результат
         COUNT(*) OVER() AS N
     FROM
         T) DS
JOIN articles a ON a.ID=DS.ID
ORDER BY DS.RND
FETCH FIRST 10 ROWS ONLY
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632195
Фотография barry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты имел ввиду второй вызов ORDER BY DS.RND, а третий SELECT FIRST 20 a.ID, DS.RND.
Ситуация вообще не контролируемая...
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632199
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barry,

по поводу запроса я соврал. Не смотря на то что окно буферизируется, но всё равно столбец перевычисляется.

А вот так работает

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
WITH DS
AS (SELECT
        a.ID,
        -- вот это материализует точно
        (SELECT RAND() FROM RDB$DATABASE) AS RND 
    FROM
        articles a
    ORDER BY A.ID DESC
    FETCH FIRST 100 ROWS ONLY)
SELECT
    a.ID, DS.RND AS RND1, DS.RND AS RND2
FROM DS
JOIN articles a ON a.ID=DS.ID
ORDER BY DS.RND


FETCH FIRST 10 ROWS ONLY
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632211
Фотография Дегтярев Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barry,

> В чем смысл - из 100 последних фотографий (по ID) делаем выборку 20 случайных.
не стоит напрягать этим сервер
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632228
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дегтярев Евгений,

А кого надо напрягать? Сеть, передавая все 100?
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632231
Фотография barry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Денис
Последний твой запрос дает у меня все время одинаковый набор ID с сортировкой по ID. Колонки RND1, RND2 с одним значением.
По твоему запросу получается хвост наименьших ID из последних 100.
В принципе своим первым запросом я решаю поставленную задачу - выборка 20 хаотичных фотографий из последних 100.
Проблема просто в том, что я уже на протяжении ряда лет работы с IB/FB давно не задавал себе вопрос - все ли у меня в порядке с головой. :)
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632237
Фотография barry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дегтярев Евгений,
> не стоит напрягать этим сервер
Ты эксперт по оценке напряжения серверов?
Берем 100 штук ID по ключу, из низ выдергиваем 20, правда беспорядочно, но такова суть идеи.
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632294
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barryили я еще что-то упустил...

http://www.ibase.ru/dataaccesspaths/
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632298
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barry,

мда, чёт внимание не обратил. Ну тогда из ХП. А вообще в чём глубокий смысл сохранить значение этого RAND? Главное ведь чтобы значения в случайном порядке выдавались. Есть ли вообще смысл возвращать значение DS.RND?
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632303
Фотография barry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,
Не, смысла особого нет, все равно мы же ведь хаос выбираем.
Задача нормально решается еще моим первым запросом.
Просто немножко странно как оно все это проявляется, если на это смотреть и как оно устроено внутри. :)
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632308
Фотография barry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я просто ожидал однократного срабатывания RAND(), лишь в том месте где оно явно указано.
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632316
Фотография barry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неужели и внутренний Gen_ID(...) мне извне кашу выдаст?
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632319
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barry,

все вычисляемые поля вычисляются столько раз сколько используются, это касается не только RAND
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632361
Hommer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
create table ExperimentData(
  Id integer not null primary key,
  ExperimentId integer,
  P1 blob,
  P2 blob,
  P3 blob,
  P4 blob
  ...
  P100 blob
);

select LongExecTimeMathFunc(P1, P2, P3, P4, ..., P100) as ResultValue from ExperimentData order by ResultValue

Если в таблице 1000 записей, то функция LongExecTimeMathFunc будет вызвана 2000 раз.

А ещё может быть:
Код: sql
1.
2.
3.
insert into TransferPaymentsLog(PaymentBlockId, PaymentId, FromId, ToId, Amount, TransferResult) 
select (cast(:PaymentBlockId as integer)), PaymentId, FromId, ToId, Amount, TransferPayment(PaymentId, FromId, ToId, Amount) as TransferResult 
from PaymentsToTransfer order by TransferResult


Какой процент разработчиков знает, что TransferPayment будет вызван по два раза на запись? И таким образом может случиться либо по два перевода (и вторые без записи в лог), либо в логе записи будут не отсортированы по TransferResult.

А какой процент разработчиков вспомнит что он это знает?
Вот вы, например, читающий эти строки, вспомните?
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632377
Фотография barry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,
> все вычисляемые поля вычисляются столько раз сколько используются, это касается не только RAND
Кажется мне нужна перезагрузка... внутренний вызов Gen_ID действительно "живой" извне...
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632378
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HommerКакой процент разработчиков знает, что TransferPayment будет вызван по два раза на запись?100% получивших пендель за такой код с побочными эффектами
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632385
Hommer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hvladHommerКакой процент разработчиков знает, что TransferPayment будет вызван по два раза на запись?100% получивших пендель за такой код с побочными эффектами
А как он догадается где проблема?
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632387
Hommer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Hommerhvladпропущено...
100% получивших пендель за такой код с побочными эффектами
А как он догадается где проблема?
Дающие пендель подскажут?
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632405
Фотография barry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad,
Влад, в свое время я поднимал вопрос поводу того, что измененный генератор при откате транзакции не откатывается назад. Меня вроде как убедили, что генератор мол особый объект, живущий вне транзакции. Хотя это тоже определенные данные в БД. Ну ладно... пусть будет так.
Ну а здесь... Я же ведь значения полей беру из внутреннего подзапроса. Ну надо мне повторное срабатывание функции - я явно укажу вызов функции. Я не мог даже предполагать, что оно живое и динамичное.
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632406
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hommer,

ну ты прям пишешь будто для тебя это открытие. Все уже давно знают, что такую ересь писать нельзя.
Вроде не первый год на форуме
...
Рейтинг: 0 / 0
25 сообщений из 67, страница 1 из 3
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Сортировка по RAND()
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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