如何统计字符串链中id3下的唯一产品ID数量
统计隶属于指定父ID的唯一子产品ID简便方案
核心思路
无需拆分后反转数组,直接通过层级定位+筛选展开即可实现:只要id3出现在层级路径中,它之后的所有ID都是直接或间接隶属于它的。我们只需提取这些ID,去重后计数即可。
实现示例(以SQL场景为例)
方法1:轻量字符串匹配+拆分(适配多数SQL引擎)
直接定位id3在路径中的位置,提取其后的所有子串,拆分后去重计数:
SELECT COUNT(DISTINCT single_id) AS subordinate_count FROM ( -- 先筛选包含id3的行,提取id3之后的子路径 SELECT SUBSTRING(col1 FROM POSITION('/id3/' IN col1) + 5) AS sub_path FROM your_table WHERE col1 LIKE '%/id3/%' ) t, -- 将子路径拆分为单个ID UNNEST(SPLIT(sub_path, '/')) AS single_id WHERE single_id != ''; -- 排除空值
方法2:递归CTE(适用于支持递归的SQL,如MySQL 8+/PostgreSQL/Spark SQL)
适合需要更精细层级处理的场景,清晰追踪每个ID的层级关系:
WITH RECURSIVE hierarchy_nodes AS ( -- 拆分每行路径为单个节点,记录节点在路径中的位置 SELECT col1, SPLIT_PART(col1, '/', seq) AS node_id, seq AS node_pos FROM your_table, GENERATE_SERIES(1, (SELECT MAX(ARRAY_LENGTH(SPLIT(col1, '/'))) FROM your_table)) AS seq WHERE seq <= ARRAY_LENGTH(SPLIT(col1, '/')) ), id3_subordinates AS ( -- 找到每个路径中id3的位置,筛选出位置在其之后的节点 SELECT hn.node_id FROM hierarchy_nodes hn JOIN ( SELECT col1, node_pos AS id3_pos FROM hierarchy_nodes WHERE node_id = 'id3' ) id3_positions ON hn.col1 = id3_positions.col1 WHERE hn.node_pos > id3_positions.id3_pos ) -- 去重计数 SELECT COUNT(DISTINCT node_id) AS subordinate_count FROM id3_subordinates;
结果验证
针对示例数据执行后,将得到唯一ID集合[id4, id5, id6, id10, id14, id21, id34],计数为7,符合预期。
内容的提问来源于stack exchange,提问作者user37143
相关产品推荐
相关产品推荐

