按结果使用SQL查找组中的元素

时间:2017-12-06 12:02:26

标签: sql google-bigquery string-aggregation

我有一个包含事件日志的表,架构:

userid, event, timestamp

我希望按用户ID分组并找到该用户具有特定事件

离。

userid, events
A, "open, click, remove, restart"

所以我想把结果组作为字符串/数组

有什么方法可以做到这一点吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

以下是BigQuery Standard SQL

作为示例 - 假设您想要获取具有remove事件的用户的所有#standardSQL SELECT userid, STRING_AGG(event ORDER BY ts) AS events FROM `project.dataset.yourtable` GROUP BY userid HAVING REGEXP_CONTAINS(LOWER(events), r'\bremove\b') 事件的列表:

#standardSQL
WITH `project.dataset.yourtable` AS (
  SELECT 'A' userid, 'open' event, 1 ts UNION ALL
  SELECT 'A', 'click', 2 UNION ALL
  SELECT 'A', 'remove', 3 UNION ALL
  SELECT 'A', 'restart', 4 UNION ALL
  SELECT 'B', 'open', 1 UNION ALL
  SELECT 'B', 'click', 2   
)
SELECT userid,
  STRING_AGG(event ORDER BY ts) AS events
FROM `project.dataset.yourtable`
GROUP BY userid
HAVING REGEXP_CONTAINS(LOWER(events), r'\bremove\b') 

您可以使用以下虚拟数据进行上述测试/播放

userid  events   
A       open,click,remove,restart   

结果如下(用户B未显示,因为此用户甚至不存在删除)

public class Test1
{
    public Test2 Test2 { get; set; }
}

public class Test2 { }

答案 1 :(得分:1)

您可以使用update()中的group_concat功能实现此目的。

BigQuery

您还简要提一下,您希望找到具有特定事件的用户,您可以将其作为select userid, group_concat(event, ', ') as events from EventLog group by userid; 子句的一部分添加,但是您没有提供任何有关如何缩小范围的示例它失败了,我省略了那一部分。如果你能提供一个更具体的案例来说明你在寻找什么,我可以更新我的答案以反映这一点。