1、问题:统计所有标签的出现次数,每行数据的标签数量不定,标签内容不定(使用的是SQLite数据库)。

2、处理思路:以标签字段中逗号为分割节点,每次处理都取出左侧第一个标签的值,传递剩余的值作为下一次循环的参数。递归以标签字段为空作为结束条件。

3、步骤:
(1)设置递归公用表达式split:字段分别为id、tab和other_tab分别代表着id、当前标签和剩余标签。
(2)初始化数据:id正常,tab初始为空,标签后拼接逗号确保每次都可以定位到标签
(3)递归部分:id正常,tab通过substr(other_tab, 0, instr(other_tab, ‘,’))取第一个逗号前的标签,other_tab通过substr(other_tab, instr(other_tab, ‘,’)+1)取剩下的标签,如果other_tab不为空,则这一次other_tab输出的结果会作为下一次递归的other_tab的值,再进行一次截取,直到最后other_tab的值为空,递归结束。
(4)结果处理:依据上述方式,每次获得到的标签所在字段为tab,而我们初始化的时候tab是为空的,所以我们此处要tab!=’’。接着再对得到的数据依据tab进行GROUP BY + COUNT()。由此我们可以得到所有的标签以及他们出现的次数。

WITH split(id,tab,other_tab) AS
(
  -- 初始化数据 
  SELECT
  	id,
  	'' AS tab,
  	标签||',' AS other_tab
  FROM 
  	okj1ql
  	    
  UNION ALL
  
  -- 递归主体
  SELECT 
  	id,
  	substr(other_tab, 0, instr(other_tab, ',')) AS tab,
  	substr(other_tab, instr(other_tab, ',')+1) AS other_tab
   FROM 
   	split 
   WHERE 
   	other_tab!=''
)


SELECT tab,COUNT(tab) num FROM split WHERE tab != '' GROUP BY tab

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注