有没有办法在雪花的行和列之间进行匹配?

时间:2020-09-25 05:10:26

标签: sql snowflake-cloud-data-platform

我在雪花中有以下数据集,其中有两列-用户和匹配的用户。我想通过matched_user遍历表,并在找到匹配项时分配相同的用户值。 例如,user1000与user100匹配,而user 100与user200,user1000匹配,因此user1000被分配给这三个用户。而对于user2000,没有匹配项。有没有程序代码和循环的有效方法吗?

user   | matched_user| Desired Output
user1000|   user100 | User1000
user1000|   user1000| User1000
user200 |   user200 | User1000
user200 |   user100 | User1000
user100 |   user100 | User1000
user100 |   user200 | User1000
user100 |   user1000| User1000
user2000|   user2000| user2000

1 个答案:

答案 0 :(得分:0)

这是一个图形遍历问题。

您可以为此使用递归CTE。从顶部开始,一直往下走。因为您有周期,所以这比较棘手。我没有雪花可以测试,但是逻辑是这样的:

with recursive tt as (
      select usr, matched_user from t
      union  -- on purpose to get bidirectional edges
      select matched_user, usr from t
     ), 
     cte as (
      select usr, matched_user, usr as desired, to_array('') as visited, 1 as lev
      from tt t
      union all
      select t.usr, t.matched_user, cte.desired, array_concat(cte.visited, t.usr), cte.lev + 1
      from cte join
           tt t
           on t.usr = cte.matched_user
      where lev < 5 and
            array_position(t.usr, cte.visited,) is null
     )
select usr, max(desired)
from cte
group by usr;

这将在每个用户级别分配desired列。如果需要边缘数据,则可以重新加入原始数据。另外,第一组的desireduser200,因为那是最大值。

Here是使用Postgres的db <>小提琴。