新手BigQuery,SQL如何统计包含特殊行的组数

Posted

技术标签:

【中文标题】新手BigQuery,SQL如何统计包含特殊行的组数【英文标题】:newbie BigQuery, SQL how to count the number of groups that contain special rows 【发布时间】:2018-08-07 18:47:25 【问题描述】:

我是新手

我使用 firebase 事件来跟踪我的用户在我的网站上所做的事情。

作为一个简单的例子,我的“快乐”用例是用户完成了步骤 A、B、C。我想计算拥有快乐或不快乐的用户数量。不快乐被定义为他们的会话不包含所有三个事件

这是我的示例 SQL,其中包含一些简单的数据。我能够计算快乐会话中“C”事件的数量。我不知道如何识别不快乐的会话

与测试数据作为( 选择“id1”作为 idd,“A”作为名称 UNION ALL 选择“id1”,“B”联合所有 选择“id1”,“C”联合所有 选择“id2”,“A”联合所有 选择“id2”,“B”联合所有 选择“id3”作为 id,“A”作为名称 UNION ALL 选择“id3”,“B”联合所有 选择“id3”,“C”联合所有 选择“id4”,“A”联合所有 选择“id4”,“B”联合所有 选择“id5”,“A”联合所有 选择“id5”,“B”联合所有 选择“id5”,“C”联合所有 选择“id5”,“A”联合所有 选择“id5”,“B”联合所有 选择“id5”,“C” ) 选择 * 从 (选择 idd, COUNT(name) as PASSED 从 testData 其中名称 = "C" 通过...分组 同上) 联合所有 (选择 idd, NUMERIC '0' 为 PASSED 从 testData where name != "C" 通过...分组 同上) 订购方式 idd 行 idd 已通过 1 ID1 1 2 id1 0 3 id2 0 4 id3 1 5 id3 0 6 id4 0 7 id5 2 8 id5 0

我期待结果会是这样的

行 idd 已通过 1 ID1 1 3 id2 0 4 id3 1 6 id4 0 7 id5 2

任何建议将不胜感激。

还有谁能推荐一个非常好的高级 SQL 教程?

安迪

【问题讨论】:

【参考方案1】:

您可以使用聚合。假设只允许这三种状态,这里有一种方法:

select idd,
       (CASE WHEN count(distinct name) = 3 THEN 'Happy' else 'Unhappy' end) as state_of_mind
from testData
group by idd;

如果可以存在其他状态,则:

select idd,
       (CASE WHEN count(distinct case when name in ('A', 'B', 'C') THEN name END) = 3 THEN 'Happy' else 'Unhappy' end) as state_of_mind
from testData
group by idd

【讨论】:

【参考方案2】:

根据您问题中的代码 - 您只需依赖步骤 C(如果到达步骤 C 的唯一方法是完成步骤 A,然后完成步骤 B,那么这很有意义) 所以,我按照您原始查询中的想法进行了修复

#standardSQL
SELECT idd, COUNTIF(name = "C") Passed
FROM testData 
GROUP BY idd
-- ORDER BY idd

如果应用于您问题中的虚拟数据 - 结果将符合预期

Row     idd     Passed   
1       id1     1    
2       id2     0    
3       id3     1    
4       id4     0    
5       id5     2    

【讨论】:

嗨,Mikhail,非常感谢我浪费了几个小时来尝试 count(name != "C")。我希望我知道 COUNTIF。如果聚合过滤器通常支持布尔表达式,那就太好了【参考方案3】:

还有谁能推荐一个非常好的高级 SQL 教程?

这些对我有帮助:-) 教程:http://www.sql-tutorial.ru/ 练习(带有示例数据库和检查器):http://www.sql-ex.ru/

【讨论】:

【参考方案4】:

谢谢

Gordon Linoff 上面建议的技巧是使用我以前从未见过的“CASE”

这是我的最终解决方案

与测试数据作为( - 快乐的 选择“id1”作为 idd,“A”作为名称 UNION ALL 选择“id1”,“B”联合所有 选择“id1”,“C”联合所有 - 不开心 选择“id2”,“A”联合所有 选择“id2”,“B”联合所有 - 快乐的 选择“id3”,“A”联合所有 选择“id3”,“B”联合所有 选择“id3”,“C”联合所有 - 不开心 选择“id4”,“A”联合所有 选择“id4”,“B”联合所有 - 快乐的 选择“id5”,“A”联合所有 选择“id5”,“B”联合所有 选择“id5”,“C”联合所有 选择“id5”,“A”联合所有 选择“id5”,“B”联合所有 选择“id5”,“C” ) , isHappyTable AS ( 选择 身份证, 案子 WHEN 名称在 ('C') 然后是数字“1” 别的 数字“0” END as isHappy 从 测试数据 订购方式 idd ) 选择 身份证, SUM(isHappy) AS isHappy 从 isHappyTable 通过...分组 idd 订购方式 idd 行 idd isHappy 1 ID1 1 2 id2 0 3 id3 1 4 id4 0 5 id5 2

【讨论】:

即使您对此发表了评论-但看起来您还没有看到(或完全忽略)我的答案-如果您可以使用简单的 COUNTIF(name = "C") ,为什么要如此冗长的解决方案。奇怪的选择!

以上是关于新手BigQuery,SQL如何统计包含特殊行的组数的主要内容,如果未能解决你的问题,请参考以下文章

获取 BigQuery 中最新行的属性?

如何将每个给定长度的行的 Bigquery 表提取到 Google Storage 中的 csv 文件?

寻找 BigQuery 标准 SQL 教程、示例、书籍的新手,

如何使用 Bigquery 连接 GCP SQL 实例?

表名上的特殊字符 Bigquery

将 id 插入具有相同信息的行的 PL/SQL 过程