1

. Удивительно, имеет ли кто-то представление о нечетном поведении, которое я испытываю с помощью запроса Amazon Redshift, включающего несколько столбцов ROW_NUMBER() OVER (ORDER BY RANDOM()) в одном table (простой способ нарисовать несколько случайных выборок из таблицы).Amazon Redshift - SQL - поведение RANDOM() при вызове в нескольких случаях ROW_NUMBER() ORDER BY.

Минимальный рабочий пример: допустим, у меня есть стол data с одной колонкой id и 10 строк. Этот запрос:

SELECT id, 
     ROW_NUMBER() OVER (ORDER BY RANDOM()) AS rk1, 
     ROW_NUMBER() OVER (ORDER BY RANDOM()) AS rk2 
FROM data ORDER BY rk1 

всегда дает мне что-то вроде:

id rk1 rk2 
5 1 1 
3 2 2 
7 3 3 
10 4 4 
6 5 5 
8 6 6 
1 7 7 
9 8 8 
2 9 9 
4 10 10 

, когда я бы ожидал что-то вроде:

id rk1 rk2 
5 1 6 
3 2 3 
7 3 9 
10 4 1 
6 5 8 
8 6 5 
1 7 7 
9 8 10 
2 9 4 
4 10 2 

То есть, похоже, Redshift только вычисления RANDOM() один раз на каждой строке, несмотря на два вызова, поэтому заказы всегда одинаковы. Но это странно, потому что этот простой запрос:

SELECT RANDOM(), RANDOM() 

возвращает что-то вроде:

random    random 
0.87943100551116793 0.23245479410162884 

, как и ожидалось. Так что здесь происходит? Имеет ли это отношение к вызову RANDOM(), находящемуся в функции окна?

Не очень важная проблема для моих нужд, поскольку я могу просто делать эти случайные ранги в отдельных запросах и присоединяться, но это было бы очень простым способом сделать это.

Не удалось найти что-либо на сайте, которое было похоже на это, хотя извинения, если оно уже было задано и адресовано. Благодаря!!

ответ

0

Вы можете использовать подзапрос для подсчета количества строк дважды:

SELECT id, rk1, row_number() over (ORDER BY random()) AS rk2 
FROM (SELECT id, row_number() over (ORDER BY random()) AS rk1 
     FROM generate_series(1,10) AS "data"(id)) as sub 
ORDER BY rk1; 

SqlFiddleDemo

Выход:

╔═════╦══════╦═════╗ 
║ id ║ rk1 ║ rk2 ║ 
╠═════╬══════╬═════╣ 
║ 1 ║ 1 ║ 7 ║ 
║ 2 ║ 2 ║ 8 ║ 
║ 6 ║ 3 ║ 4 ║ 
║ 9 ║ 4 ║ 10 ║ 
║ 8 ║ 5 ║ 3 ║ 
║ 10 ║ 6 ║ 9 ║ 
║ 4 ║ 7 ║ 6 ║ 
║ 5 ║ 8 ║ 1 ║ 
║ 7 ║ 9 ║ 2 ║ 
║ 3 ║ 10 ║ 5 ║ 
╚═════╩══════╩═════╝ 
+0

Это тоже работает! (Как и присоединение к двум экземплярам запроса.) Но мне все еще интересно, что ведет к оригинальному поведению. –

Смежные вопросы