PostgreSQL: почему random () не работает в соединении? - PullRequest
0 голосов
/ 04 января 2019

Я пытаюсь распечатать список всех действий для случайной группы из 500 пользователей, которые начали использовать мое приложение после 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 голосов
/ 04 января 2019

Переосмысливая это сейчас, я полностью понимаю, что вы ищете. 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...