我有这个表,其中列主题包含标签数组。我们如何获得主题和标签列中出现相同值的次数。
| topics | label |
| ------------ | ------ |
| [A, B, C, D] | A |
| [D] | G |
| [C, D] | D |
| [G, A] | C |
| [A, C] | A |
| [B, G] | A |
在上面的示例中,A 出现了 2 次(第 1 行和第 5 行)。 D 出现 1 秒(第 3 行)。
| label | count |
| -------- | ------|
| A | 2 |
| D | 1 |
我尝试使用
any_match(
topics,
e -> e > A
)
但是不允许直接传递列名。
一种选择是形成分隔的标签列表,并计算带有和不带有特定标签的列表的长度,其中两者的差异是出现的次数。保留所有选定的列以进行澄清。
Select TOPICS,
Replace( Replace(Replace(TOPICS, '[', ','), ']', ','), ' ', '') "LABEL_LIST",
--
LABEL,
( ( Length( Replace( Replace(Replace(TOPICS, '[', ','), ']', ','), ' ', '') ) -
Length( REPLACE(
Replace( Replace(Replace(TOPICS, '[', ','), ']', ','), ' ', ''),
',' || LABEL || ',', '')
)
) / Length(',' || LABEL || ',')
) + 1 "RATIO"
From tbl
/* R e s u l t :
TOPICS LABEL_LIST LABEL RATIO
------------ ------------ ----- ----------
[A, B, C, D] ,A,B,C,D, A 2
[D] ,D, G 1
[C, D] ,C,D, D 2
[G, A] ,G,A, C 1
[A, C] ,A,C, A 2
[B, G] ,B,G, A 1 */