雪花 - 计算逗号分隔列表中的不同值

Posted

技术标签:

【中文标题】雪花 - 计算逗号分隔列表中的不同值【英文标题】:Snowflake - Count distinct values in comma seperated list 【发布时间】:2021-05-10 20:09:16 【问题描述】:

我基本上有一列如下所示。

"[
  ""what"",
  ""how"",
]"
"[
  ""how"",
  ""what"",

]"
"[
  ""project_management"",
  ""do it"",
  ""personal""
]"
"[
  ""do it"",
  ""finance"",
  ""events"",
  ""save""
]"
"[
  ""do it"",
  ""sales"",
  ""events""
]"
"[
  ""finance"",
  ""sales"",
  ""events""
]"
"[
  ""events""
]"

我很简单地尝试获取列中每个唯一实例/值的计数,并为每个由字符串分隔的值输出值计数。输出应如下所示:

What: 2 
how: 2
do it: 3 
Finance: 4 
etc. 

我尝试了以下方法,但问题是它只计算重复自身的列表,而不是列表本身中的单个值

select (i.OUTCOMES), count(i.OUTCOMES)
from table i
GROUP BY 1;

【问题讨论】:

列的数据类型是什么? 'VARIANT' - 应该已经澄清(相信基本上是一个 JSON 列?目前还不确定这个命名法) 【参考方案1】:

您需要扁平化这些值。

如果变量是描述的数组:

with data as (
select parse_json('["a", "b"]') v
union select parse_json('["a", "a", "c"]')
)

select x.value::string val, count(*) c
from data, table(flatten(v)) x
group by 1
;

【讨论】:

【参考方案2】:

看起来像一个数组,所以需要使用两次flatten:

with data as (
select ARRAY_CONSTRUCT( ARRAY_CONSTRUCT('what','how'), 
ARRAY_CONSTRUCT('how','what'), 
ARRAY_CONSTRUCT('project_management','do it', 'personal') ) OUTCOMES
)
select item.VALUE::string, count(*) from data,
lateral flatten( OUTCOMES ) v,
lateral flatten( v.VALUE ) item
group by item.VALUE; 

+--------------------+----------+
| ITEM.VALUE::STRING | COUNT(*) |
+--------------------+----------+
| what               |        2 |
| how                |        2 |
| project_management |        1 |
| do it              |        1 |
| personal           |        1 |
+--------------------+----------+

【讨论】:

【参考方案3】:

使用 SPLIT_TO_TABLE 和替换函数

SELECT COL_VAL,COUNT(COL_VAL) FROM

(

SELECT REPLACE(REPLACE(REPLACE(VALUE,'['),'"'),']') COL_VAL FROM TABLE(SPLIT_TO_TABLE('"[ ““什么””, ““如何””, ]" “[ ““如何””, ""什么",

]" “[ ““项目管理””, ""做"", ““个人的”” ]" “[ ""做"", ““金融””, ""事件"", ““节省”” ]" “[ ""做"", ““销售量””, ""事件"" ]" “[ ““金融””, ““销售量””, ""事件"" ]" “[ ""事件"" ]"',','))) GROUP BY COL_VAL;

【讨论】:

以上是关于雪花 - 计算逗号分隔列表中的不同值的主要内容,如果未能解决你的问题,请参考以下文章

如何从包含逗号分隔条目的变量中创建(不同的)值列表?

从具有不同值的逗号分隔 JSON 对象填充 html 下拉列表

如何在 SQL 中计算逗号分隔列表中的字符串项

如何将不同的逗号分隔值插入mysql中的不同列

SQL Server 将三个不同的列连接成逗号分隔且没有重复值

通过连接来自不同列的逗号分隔值来创建字符串