Pet*_*gel 5 sql standards google-bigquery
我目前在使用标准 SQL 查询时遇到问题。我有一个电子邮件列表,其中每封电子邮件都可以具有多种功能。请参阅下面的示例,了解表格的外观。
Email Function
peter@gmail.com engineer
peter@gmail.com specialist
dave@gmail.com analyst
dave@gmail.com tester
dave@gmail.com manager
michael@gmail.com intern
Run Code Online (Sandbox Code Playgroud)
我想要的是一个查询,它使用它找到的第一个函数返回每封电子邮件一次。所以上表应该返回以下内容:
Email Function
peter@gmail.com engineer
dave@gmail.com analyst
michael@gmail.com intern
Run Code Online (Sandbox Code Playgroud)
我该怎么做呢?
我现在拥有的是查询的简化版本。
SELECT Email, Function
FROM database
GROUP BY Email, Function
Run Code Online (Sandbox Code Playgroud)
问题是我必须将电子邮件和函数都放在 GROUP BY 中。如果我只将 Email 放在 Group By 中,即使我只希望查询 GROUP BY Email,查询也无法运行。
谢谢!
Gor*_*off 10
不存在“第一个”函数这样的东西,因为 SQL 表代表无序集——尤其是在 BigQuery 等从头开始设计的并行数据库中。
您需要使用某种聚合函数。
一个简单的就是any_value():
SELECT Email, ANY_VALUE(Function)
FROM database
GROUP BY Email;
Run Code Online (Sandbox Code Playgroud)
如果您有另一个指定排序的列,则可以使用它来获取function与该列的最小值关联的值。
使用row_number()窗口函数
select * from
(
select *, row_number() over(partition by email order by funcion) as rn
from tablename
)a where rn=1
Run Code Online (Sandbox Code Playgroud)
您需要指定列顺序的排序列,然后您可以执行以下操作:
select t.*
from table t
where t.pk = (select min(t1.pk) from table t1 where t1.email = t.email);
Run Code Online (Sandbox Code Playgroud)
这里假设pk是标识列。