雪花 - 计算逗号分隔列表中的不同值
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 下拉列表