Ответ 1
Хорошая работа в поиске :). Я недавно запросил функцию, но пока не дошел до документации.
Я бы сказал, что преимущество RAND() заключается в том, что результаты будут отличаться, в то время как HASH() будет давать вам одинаковые результаты для одних и тех же значений (не гарантируется с течением времени, но вы получаете идею).
Если вам нужна изменчивость, которую RAND() приносит, все еще получая согласованные результаты, вы можете засеять ее целым числом, как в RAND (3).
Обратите внимание, что пример, который вы вставили, выполняет полный вид случайных значений - для достаточно больших входов этот подход не будет масштабироваться.
Масштабируемый подход, чтобы получить около 10 случайных строк:
SELECT word
FROM [publicdata:samples.shakespeare]
WHERE RAND() < 10/164656
(где 10 - приблизительное количество результатов, которые я хочу получить, и 164656 количество строк, которые есть в таблице)
Стандартное обновление:
#standardSQL
SELECT word
FROM 'publicdata.samples.shakespeare'
WHERE RAND() < 10/164656
или даже:
#standardSQL
SELECT word
FROM 'publicdata.samples.shakespeare'
WHERE RAND() < 10/(SELECT COUNT(*) FROM 'publicdata.samples.shakespeare')