从一列和所有其他数据中选择n个不同的值

时间:2018-09-21 19:29:25

标签: sql vertica

我有一个表,该表每天使用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 :(得分:0)

我不确定是否将其视为自我联接,但是应该先运行SELECT DISTINCT user_id查询,然后运行外部查询的SQL Server对其进行优化。

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)

答案 1 :(得分:0)

尝试使用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

答案 2 :(得分:0)

您可以使用 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