PostgreSQL:为什么random()在联接中不起作用?

时间:2019-01-04 11:42:42

标签: postgresql

我正尝试打印出500个随机用户组的所有活动的列表,这些用户在1月1日之后开始使用我的应用。

with random_users as (select distinct id, min(timestamp) as first_event
from log
group by id 
having first_event >= '2019-01-01'
order by random() 
limit 500)

select random_users.id, log.timestamp, log.event
from random_users left join log on log.id = random_users.id

使用PostgreSQL的random()可以轻松地随机选择用户,但是当我尝试将其与having first_event >= '2019-01-01'的条件结合使用时,就会遇到一些问题。也就是说,在最终结果中,timestamp实际上在许多用户面前显示为2019-01-01之前,

id    timestamp   event
5     2018-11-12  click
2     2018-12-27  purchase
7     2019-01-03  click

我想知道这是否与random()函数的工作方式有关,因为没有此条件的类似查询会给出预期的结果我如何才能成功地将random()函数限制为在2019-01-01之后使用了该应用程序?

1 个答案:

答案 0 :(得分:1)

现在重新考虑这一点,因为我完全了解您的追求。 PostgreSQL有DISTINCT ON,可用于选择符合某些条件的第一行:

with user_first_events as (SELECT DISTINCT ON (id) id, timestamp, event
FROM log
WHERE timestamp >= '2019-01-01'
ORDER BY id, timestamp ASC)

SELECT * FROM user_first_events ORDER BY random() LIMIT 500