我在雪花中有以下数据集,其中有两列-用户和匹配的用户。我想通过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
答案 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
列。如果需要边缘数据,则可以重新加入原始数据。另外,第一组的desired
为user200
,因为那是最大值。
Here是使用Postgres的db <>小提琴。