雪花中实现sql“JOIN”返回策略的最佳实践
Posted
技术标签:
【中文标题】雪花中实现sql“JOIN”返回策略的最佳实践【英文标题】:Best practice of implementing sql "JOIN" returning policy in snowflake 【发布时间】:2021-09-28 06:10:23 【问题描述】:假设我们有两个表执行左连接:
表 1
Joint Key || Attribute 1 || Attribute 2 || Attribute 3
A 1 11 21
B 2 12 22
C 3 13 23
表 2
Joint Key || Attribute 4 || Attribute 5
A 31 41
A 32 42
C 33 43
通过在“Joint Key”上执行table 1左连接table 2
它将返回两条记录
Joint Key = 'A'
Joint Key || Attribute 1 || Attribute 2 || Attribute 3 || Attribute 4 || Attribute 5
A 1 11 21 31 41
A 1 11 21 32 42
定义返回警察的最佳做法是什么,特别是在雪花中,可以返回与 表 1 相同的行数。
以上面的例子,我希望记录有MAX(Attribute 4)
。我想到了两个初步的想法
选项1:使用“GROUP BY”子句——需要显式列出列,处理有很多列的表时很麻烦。
选项 2:类似
select * from (
select
Tabel1.*
max(Table2.Attribute_4) as mx_Attribute_4,
Table2.Attribute_5
from Table1
left join Table2
on Joint_Key
) as temp
where temp.Attribute_4 = temp.mx_Attribute_4
这也相当复杂和耗时。
还有其他建议吗?
【问题讨论】:
【参考方案1】:你可以使用QUALIFY
类似:
select
t1.Joint_key, t1.Attribute_1, t1.Attribute_2, t1.Attribute_3, t2.Attribute_4, t2.Attribute_5
from Table1 t1
left join Table2 t2
on t1.Joint_key = t2.Joint_key
qualify row_number() over(partition by Joint_Key order by Attribute_4 desc) = 1
这当然更干净,应该比 group by 更有效率。它仍然需要查询来按 Attribute_4 对记录进行排序,但我看不到避免这种情况的方法,除非您可以使用任何一组值而不是具有 MAX(Attribute_4) 的值集。在这种情况下,您可以通过在 row_number()
窗口函数中使用 order by 1
来提高效率。
【讨论】:
谢谢!我用相关的子查询尝试了类似的方法,但雪花不支持它。这就是我想要的答案!【参考方案2】:您似乎对连接的工作方式有些困惑。如果您有 Table1 left join Table2 那么它将返回 Table1 中的所有记录以及来自 Table2 中匹配记录的任何数据 - 所以在您的情况下,您通常会从 Table1 中获取 3 条记录。
但是,在您的情况下,table2 中有 2 条记录与表 1 中的 1 条记录匹配,因此这将重复您的结果,您将获得 4 条记录:2 条带有键 A,然后 1 条带有 B,1 条带有 C。
无论如何,鉴于您提供的示例数据,请用您想要达到的结果更新您的问题,以便有人可以帮助您
【讨论】:
我将这个问题解释为对左连接有很好的理解。问题中的结果仅包括问题行,即带有键“A”的“重复”行。并且请求的输出是将这两个输出行合并为一行。以上是关于雪花中实现sql“JOIN”返回策略的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章