Выберите n различных значений из одного столбца и всех других данных - PullRequest
0 голосов
/ 21 сентября 2018

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

Сейчас я делаю:

SELECT
    a.user_id, b.col1, b.col2, b.col3
FROM
    (
        SELECT DISTINCT
            user_id
        FROM
            pipeline.user_daily
        ORDER BY
            RANDOM() LIMIT 100) a
LEFT JOIN
    pipeline.user_daily b
ON
    a.user_id = b.user_id

Есть ли способ сделать это с помощью оконной функции или любого другого несамостоятельного объединения?

На несвязанной заметке приведенная выше внутренняя таблица a фактически не работает в vertica, поэтому я использую

SELECT
    user_id
FROM
    pipeline.user_daily
GROUP BY
    user_id
ORDER BY
    RANDOM() LIMIT 100

Есть мысли о том, почему случайный выбор определенного порядка не работает в Vertica?

Ответы [ 3 ]

0 голосов
/ 21 сентября 2018

Попробуйте использовать предложение WITH.Я не знаком с Vertica, но это работает в Oracle.

  WITH a AS (
       SELECT DISTINCT
                user_id
            FROM
                pipeline.user_daily
            ORDER BY
                RANDOM() LIMIT 100 )
    SELECT
        a.user_id, b.col1, b.col2, b.col3
    FROM pipeline.user_daily b
    JOIN a on a.user_id = b.user_id
0 голосов
/ 25 сентября 2018

Вы можете использовать row_number () , чтобы получить различение.

SELECT
    user_id, col1, col2, col3
FROM (
    SELECT
        user_id, col1, col2, col3, row_number() over (partition by user_id, col1, col2, col3 order by null) rn
    FROM 
        pipeline.user_daily
) sub
where rn = 1
0 голосов
/ 21 сентября 2018

Я не уверен, считается ли это самостоятельным соединением, но он должен быть оптимизирован сервером SQL, чтобы сначала выполнялся запрос SELECT DISTINCT user_id, а затем внешний.

SELECT user_id, col1, col2, col3 FROM pipeline.user_daily
WHERE
user_id IN
(SELECT DISTINCT user_id
        FROM
            pipeline.user_daily
        ORDER BY
            RANDOM() LIMIT 100)
...