我有一个表,该表每天使用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为什么无法随机选择不同顺序的任何想法?
答案 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