Сделав некоторые изменения в вашем запросе, это сработало для меня:
SELECT
user_pseudo_id
FROM (
SELECT
user_pseudo_id,
MAX(IF( days_from_today >13 AND days_from_today < 21, 1, 0)) AS prev_week,
MAX(IF( days_from_today >6 AND days_from_today <14, 1, 0)) AS last_week,
MAX(IF( days_from_today <7, 1, 0)) AS this_week
FROM (
SELECT
DATE_DIFF(CURRENT_DATE(), DATE(TIMESTAMP_MICROS(event_timestamp)), day) AS days_from_today,
user_pseudo_id
FROM
test_table
WHERE
event_name = 'user_engagement'
GROUP BY
days_from_today,
user_pseudo_id)
GROUP BY
user_pseudo_id)
WHERE
prev_week = 1
Игра с некоторыми фиктивными данными:
WITH test_table as (
select 1 as user_pseudo_id, 'user_engagement' as event_name, 1552208299000000 as event_timestamp union all
select 2 as user_pseudo_id, 'user_engagement' as event_name, 1552079299000000 as event_timestamp union all
select 3 as user_pseudo_id, 'user_engagement' as event_name, 1552186299000000 as event_timestamp union all
select 1 as user_pseudo_id, 'user_engagement' as event_name, 1551024899000000 as event_timestamp union all
select 2 as user_pseudo_id, 'user_engagement' as event_name, 1551024899000000 as event_timestamp union all
select 1 as user_pseudo_id, 'user_engagement' as event_name, 1551523899000000 as event_timestamp union all
select 1 as user_pseudo_id, 'user_engagement' as event_name, 1552024899000000 as event_timestamp
)
SELECT
DATE_DIFF(CURRENT_DATE(), DATE(TIMESTAMP_MICROS(event_timestamp)), day) AS days_from_today,
user_pseudo_id
FROM
test_table
WHERE
event_name = 'user_engagement'
GROUP BY
days_from_today,
user_pseudo_id
ORDER BY 2, 1
Что дает этот набор данных:
days_from_today user_pseudo_id
1 4 1
2 6 1
3 12 1
4 18 1
5 6 2
6 18 2
7 4 3
Здесь пользователь, который присоединился к предыдущей неделе: 1
и 2
Выполнение запроса с фиктивным набором данных:
WITH test_table as (
select 1 as user_pseudo_id, 'user_engagement' as event_name, 1552208299000000 as event_timestamp union all
select 2 as user_pseudo_id, 'user_engagement' as event_name, 1552079299000000 as event_timestamp union all
select 3 as user_pseudo_id, 'user_engagement' as event_name, 1552186299000000 as event_timestamp union all
select 1 as user_pseudo_id, 'user_engagement' as event_name, 1551024899000000 as event_timestamp union all
select 2 as user_pseudo_id, 'user_engagement' as event_name, 1551024899000000 as event_timestamp union all
select 1 as user_pseudo_id, 'user_engagement' as event_name, 1551523899000000 as event_timestamp union all
select 1 as user_pseudo_id, 'user_engagement' as event_name, 1552024899000000 as event_timestamp
)
SELECT
user_pseudo_id
FROM (
SELECT
user_pseudo_id,
MAX(IF( days_from_today >13 AND days_from_today < 21, 1, 0)) AS prev_week,
MAX(IF( days_from_today >6 AND days_from_today <14, 1, 0)) AS last_week,
MAX(IF( days_from_today <7, 1, 0)) AS this_week
FROM (
SELECT
DATE_DIFF(CURRENT_DATE(), DATE(TIMESTAMP_MICROS(event_timestamp)), day) AS days_from_today,
user_pseudo_id
FROM
test_table
WHERE
event_name = 'user_engagement'
GROUP BY
days_from_today,
user_pseudo_id)
GROUP BY
user_pseudo_id)
WHERE
prev_week = 1
Предоставляет пользователю 1
и 2
в качестве результата. Какой должен быть желаемый результат. Вы можете поиграть с этим запросом, чтобы получить разные результаты анализа.