我正尝试打印出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
之后使用了该应用程序?
答案 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