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

Find elements in group by result use SQL

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

userid, event, timestamp

我想按用户 ID 分组,发现该用户有特定事件

例如

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

所以我想将结果分组为字符串/数组

有什么办法可以做到吗?

谢谢!

您可以使用 BigQuery 中的 group_concat 函数实现此目的。

select userid, group_concat(event, ', ') as events
from EventLog
group by userid;

您还简要提到您想查找具有特定事件的用户,您可以将其添加为 where 子句的一部分,但由于您没有给出任何示例来说明您的查找情况为了缩小范围,我省略了那部分。如果你能给出一个更具体的案例来说明你正在寻找什么,我可以更新我的答案来反映这一点。

以下适用于 BigQuery 标准 SQL

举个例子 - 假设您想要获取具有 remove 事件的用户的所有 ordered 事件的列表:

#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') 

结果如下(用户 B 未显示,因为该用户甚至没有删除)

userid  events   
A       open,click,remove,restart