Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google bigquery BigQuery-在给定的时间点获取不同的值_Google Bigquery - Fatal编程技术网

Google bigquery BigQuery-在给定的时间点获取不同的值

Google bigquery BigQuery-在给定的时间点获取不同的值,google-bigquery,Google Bigquery,我有一个包含用户操作的表(例如查看页面、单击按钮等)。每行包含用户id、日期(创建日期)和操作名称。我想创建一个查询,它将为每个日期创建一个嵌套字段,其中包含在该日期之前采取的不同操作。例如,我有一个名为user\u actions的表: ------------------------------------- | user_id | date | action | ------------------------------------- | 1 | 2018

我有一个包含用户操作的表(例如查看页面、单击按钮等)。每行包含用户id、日期(创建日期)和操作名称。我想创建一个查询,它将为每个日期创建一个嵌套字段,其中包含在该日期之前采取的不同操作。例如,我有一个名为
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')

结果


哇!谢谢你的回答!我没有意识到窗口的功能部分。哇!谢谢你的回答!我没有意识到窗口的功能部分。