Google bigquery BigQuery-在给定的时间点获取不同的值
我有一个包含用户操作的表(例如查看页面、单击按钮等)。每行包含用户id、日期(创建日期)和操作名称。我想创建一个查询,它将为每个日期创建一个嵌套字段,其中包含在该日期之前采取的不同操作。例如,我有一个名为Google bigquery BigQuery-在给定的时间点获取不同的值,google-bigquery,Google Bigquery,我有一个包含用户操作的表(例如查看页面、单击按钮等)。每行包含用户id、日期(创建日期)和操作名称。我想创建一个查询,它将为每个日期创建一个嵌套字段,其中包含在该日期之前采取的不同操作。例如,我有一个名为user\u actions的表: ------------------------------------- | user_id | date | action | ------------------------------------- | 1 | 2018
user\u actions
的表:
-------------------------------------
| user_id | date | action |
-------------------------------------
| 1 | 2018-04-01 | click |
| 2 | 2018-04-01 | view |
| 1 | 2018-04-02 | view |
| 2 | 2018-04-02 | view |
| 2 | 2018-04-03 | buy |
-------------------------------------
would result in
-------------------------------------
| user_id | date | actions |
-------------------------------------
| 1 | 2018-04-01 | click |
| 2 | 2018-04-01 | view |
| 1 | 2018-04-02 | click |
| 2 | 2018-04-02 | view |
| | | view |
| 2 | 2018-04-03 | view |
| 2 | | buy |
-------------------------------------
在第二个表中,actions是一个嵌套的重复字段。我知道,对于单个时间点,我可以使用类似于以下内容的内容:
SELECT
user_id,
date,
ARRAY(action)
FROM
user_actions
GROUP BY
1,2
但是,我不确定如何扩展它,以便为原始表中的每个日期提供相同的计算,并且只查看日期
字段之前的时间
任何帮助都将不胜感激。谢谢
创建一个嵌套字段,其中包含在该日期之前(包括该日期)执行的不同操作
下面是BigQuery标准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
结果
更新
以下版本支持在同一天内对同一用户执行多个操作的更通用的情况(我意识到这不是我最初回答的情况)
您可以使用以下示例数据对其进行测试(注意extyra行的activity='play')
结果
创建一个嵌套字段,其中包含在该日期之前(包括该日期)执行的不同操作
下面是BigQuery标准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
结果
更新
以下版本支持在同一天内对同一用户执行多个操作的更通用的情况(我意识到这不是我最初回答的情况)
您可以使用以下示例数据对其进行测试(注意extyra行的activity='play')
结果
哇!谢谢你的回答!我没有意识到窗口的功能部分。哇!谢谢你的回答!我没有意识到窗口的功能部分。