Что означает RAND("totally_not_random") в SQL-запросе

    При анализе SQL-запроса с фильтрацией по дате и строкой RAND("totally_not_random") > 0.92 у многих возникает вопрос: что это за конструкция и зачем она нужна. На первый взгляд кажется, что это случайное число, но на самом деле функция RAND() с явным аргументом ведёт себя детерминированно - то есть возвращает одно и то же значение для одинакового входа. Разберёмся подробнее.

    Как работает RAND() с аргументом

    В большинстве СУБД (MySQL, MariaDB, SQLite) RAND(seed) генерирует псевдослучайное число на основе начального значения (seed). Если передать константную строку, например "totally_not_random", сервер преобразует её в числовой сид и каждый раз при выполнении запроса будет получать одно и то же число в диапазоне (0, 1).

    Таким образом, RAND("totally_not_random") > 0.92 - это не случайный фильтр, а стабильное условие, которое отбирает одни и те же строки при каждом запуске. Это удобно для A/B-тестов, отладки или создания воспроизводимой выборки.

    Зачем использовать детерминированную случайность

    Обычный RAND() без аргумента даёт разные значения при каждом вызове, что делает результаты запроса непредсказуемыми. Если нужно выделить, например, 8% записей (условие RAND() > 0.92), но так, чтобы при повторном запуске выборка не менялась, используют фиксированный сид.

    В приведённом исходном запросе:

    SELECT *
    FROM t1
    WHERE date BETWEEN '2024-11-01' AND '2024-11-02'
      AND RAND("totally_not_random") > 0.92

    сначала отбираются строки за указанные даты, а затем из них остаются только те, для которых детерминированное псевдослучайное число превышает 0.92. Поскольку сид одинаков, результат повторяем.

    Практические применения

    Такой подход часто используют в:

    • Тестировании - чтобы получить стабильную подвыборку для проверки кода;
    • Рандомизации в продакшене - например, показывать одно и то же предложение одним и тем же пользователям;
    • Выборке для анализа - когда нужно воспроизвести случайную группу без изменения данных.

    Ограничения и нюансы

    Важно помнить: детерминированность работает только при одинаковом сиде. Если изменить строку-аргумент, изменится и набор строк. Также в некоторых СУБД (например, PostgreSQL) RAND() не поддерживается - там используют RANDOM() с seed через SETSEED(). В MySQL и MariaDB конструкция RAND(строка) работает как описано.

    Таким образом, RAND("totally_not_random") - это не ошибка и не шутка, а осмысленный приём для получения повторяемой псевдослучайной фильтрации.

    Часто задаваемые вопросы