雪花中实现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”返回策略的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

雪花数据加载最佳实践规范化还是非规范化?

在雪花中放置多个仓库的最佳方法?

21条最佳实践,全面保障 GitHub 使用安全

5个Kubernetes监控最佳实践

雪花存储过程 - 多个多行 SQL 命令

MSSQL · 最佳实践 · 利用文件组实现冷热数据隔离备份方案