создать вложенное поле для отдельных действий, предпринятых до этой даты, включая ее
Ниже приведено описание BigQuery Standrad SQL
#standardSQL
SELECT user_id, date,
ARRAY(
SELECT DISTINCT action FROM UNNEST(actions) action
) actions
FROM (
SELECT user_id, date, ARRAY_AGG(action) OVER(win) actions
FROM `project.dataset.table`
WINDOW win AS (
PARTITION BY user_id ORDER BY date
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
)
)
Вы можете протестировать, сыгратьс использованием вышеупомянутых примеров данных из вашего вопроса, как в примере ниже
#standardSQL
WITH `project.dataset.table` AS (
SELECT 1 user_id, '2018-04-01' date, 'click' action UNION ALL
SELECT 2, '2018-04-01', 'view' UNION ALL
SELECT 1, '2018-04-02', 'view' UNION ALL
SELECT 2, '2018-04-02', 'view' UNION ALL
SELECT 2, '2018-04-03', 'buy'
)
SELECT user_id, date,
ARRAY(
SELECT DISTINCT action FROM UNNEST(actions) action
) actions
FROM (
SELECT user_id, date, ARRAY_AGG(action) OVER(win) actions
FROM `project.dataset.table`
WINDOW win AS (
PARTITION BY user_id ORDER BY date
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
)
)
-- ORDER BY date, user_id
с результатом
![enter image description here](https://i.stack.imgur.com/ixh8C.png)
Обновление
Ниже версия поддерживает более общий случай с несколькими действиями для одного и того же пользователя в течение одного дня (я понял, что это был не случай с моим первоначальным ответом)
#standardSQL
SELECT user_id, date,
ARRAY(
SELECT DISTINCT action FROM UNNEST(SPLIT(actions)) action
) actions
FROM (
SELECT user_id, date , STRING_AGG(actions) OVER(win) actions
FROM (
SELECT user_id, date, STRING_AGG(DISTINCT action) actions
FROM `project.dataset.table`
GROUP BY user_id, date
)
WINDOW win AS (
PARTITION BY user_id ORDER BY date
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
)
)
Вы можете проверить его с помощью нижепримерные данные (обратите внимание на строку с дополнительной активностью = 'play')
#standardSQL
WITH `project.dataset.table` AS (
SELECT 1 user_id, DATE '2018-04-01' date, 'click' action UNION ALL
SELECT 2, '2018-04-01', 'view' UNION ALL
SELECT 1, '2018-04-02', 'view' UNION ALL
SELECT 1, '2018-04-02', 'play' UNION ALL
SELECT 2, '2018-04-02', 'view' UNION ALL
SELECT 2, '2018-04-03', 'buy'
)
SELECT user_id, date,
ARRAY(
SELECT DISTINCT action FROM UNNEST(SPLIT(actions)) action
) actions
FROM (
SELECT user_id, date , STRING_AGG(actions) OVER(win) actions
FROM (
SELECT user_id, date, STRING_AGG(DISTINCT action) actions
FROM `project.dataset.table`
GROUP BY user_id, date
)
WINDOW win AS (
PARTITION BY user_id ORDER BY date
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
)
)
-- ORDER BY date, user_id
с результатом
![enter image description here](https://i.stack.imgur.com/7dxM0.png)