在SQL中计算两列中的匹配值

问题描述 投票:0回答:1

我有这个表,其中列主题包含标签数组。我们如何获得主题和标签列中出现相同值的次数。

|     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
)

但是不允许直接传递列名。

sql presto
1个回答
0
投票

一种选择是形成分隔的标签列表,并计算带有和不带有特定标签的列表的长度,其中两者的差异是出现的次数。保留所有选定的列以进行澄清。

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    */
© www.soinside.com 2019 - 2024. All rights reserved.