作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一组数据,它们是通过将相似的子项目匹配在一起,然后按“类别”对这些相似的项目进行分组而创建的。
现在,生成的类别必须以在每个“group_id”中将相关类别组合在一起的方式进行匹配。在下面的示例中,一个匹配项是 A->B->C->D->E->F->G,这是通过对行进行递归获得的。
我已经发布了我的 current answer ,它适用于这个简单的数据集,但由于实际数据集最多包含 1M 行,并且每个“group_id”可能有多达 60 个类别,因此此查询会导致实际数据出现“假脱机空间不足”错误。
请注意:
正确答案会
Sample Input:
Desired Output:
最佳答案
您需要一个递归方法,但是您的WITH RECURSIVE
会创建一个巨大的中间结果,这会导致不再有假脱机。
对于类似的过程,我使用了以下方法(最初在存储过程中使用 WHILE 循环):
CREATE MULTISET VOLATILE TABLE vt_tmp, NO Log AS
(
SELECT group_id, category_1, category_2,
-- assign a unique number to
Dense_Rank() Over (ORDER BY group_id, category_1) AS rnk
-- remove when you source data is unique
GROUP BY 1,2,3 -- same result as a DISTINCT, but processed before DENSE_RANK
FROM match_detail
)
WITH DATA
PRIMARY INDEX (category_2)
ON COMMIT PRESERVE ROWS;
现在重复以下更新,直到处理了 0 行
:
-- find matching categories and assign them a common number
UPDATE vt_tmp FROM
( SELECT e2.group_id, e2.category_1, Min(e1.rnk) AS minrnk
FROM vt_tmp e1 JOIN vt_tmp e2
ON e1.category_2 = e2.category_2
AND e1.rnk < e2.rnk
GROUP BY e2.group_id, e2.category_1
) x
SET rnk = minrnk
WHERE
vt_tmp.group_id = x.group_id
AND vt_tmp.category_1 = x.category_1
;
要获得您最终需要的相关类别:
SELECT group_id, category_1 AS category, rnk AS related_categories
FROM vt_tmp
UNION
SELECT group_id, category_2, rnk
FROM vt_tmp
为了与您的预期结果完全匹配,您需要添加 DENSE_RANK
:
SELECT group_id, category, Dense_Rank() Over (PARTITION BY group_id ORDER BY related_categories)
FROM
(
SELECT group_id, category_1 AS category, rnk AS related_categories
FROM vt_tmp
UNION
SELECT group_id, category_2, rnk
FROM vt_tmp
) AS dt
关于sql - 连通分量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40204509/
我是一名优秀的程序员,十分优秀!