对于列中的每个字符串计算平均值(第二列)

Posted

技术标签:

【中文标题】对于列中的每个字符串计算平均值(第二列)【英文标题】:For each string in column calculate average (second column) 【发布时间】:2022-01-23 18:50:04 【问题描述】:

这是我的数据集的一部分(例如冰淇淋的口味及其评级):

flavor rating
cherry, apple, flower 4.0
apple, chocolate, banana 3.0
banane, chocolate, strawberry 4.0
cherry, banane, strawberry 1.0

现在我想计算口味的平均评分。 这样我得到以下输出:

flavor avg(rating)
cherry 2.5
apple 3.5
banane 2.66
strawberry 2.5
chocolate 3.5
flower 4.0

如何在 mysql 中解决这个问题?

【问题讨论】:

请标记您的特定 RDBMS 规范化你的架构。见"Is storing a delimited list in a database column really that bad?"(剧透:是的。)。 不是完全重复,但这里的大问题是将数据拆分为单独的行,如 ***.com/q/17942508/2422776 中所回答的那样。从那里开始,您可以按风味分组并查询平均值。 【参考方案1】:
with recursive u as
(select 1 as n
union all select n + 1 from u
where n < (select max(length(flavor) - length(replace(flavor, ',', ''))) + 1 
from ice_cream)),
v as
(select
  LTRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(ice_cream.flavor, ',', u.n), ',', -1)) 
single_flavor,
ice_cream.rating
from
  u inner join ice_cream
  on CHAR_LENGTH(ice_cream.flavor)
  -CHAR_LENGTH(REPLACE(ice_cream.flavor, ',', ''))>=u.n-1
)
(select single_flavor, avg(rating) from v group by single_flavor);

u 为您提供一个表格,其中包含数字 1、2、...、最大连续单一口味的数量。 v 使用 u 将原始表中的每一行拆分为单一风味及其评分,最后一个 cte 只是将来自 v 的行按单一风味分组并计算每种风味的平均评分。

Fiddle

【讨论】:

@jarlh 引用 OP:“我怎样才能在 mysql 中解决这个问题?” 糟糕,我没有看到最后一句话。无论如何,我现在已经批准了你的修改。【参考方案2】:

您可以使用以下查询

select flavor,avg(rating)
from 
 
  (select
    tablename.rating,
    SUBSTRING_INDEX(SUBSTRING_INDEX(tablename.flavor, ',', numbers.n), ',', -1) flavor
  from
    (select 1 n union all
     select 2 union all select 3 union all
     select 4 union all select 5) numbers INNER JOIN tablename
    on CHAR_LENGTH(tablename.flavor)
       -CHAR_LENGTH(REPLACE(tablename.flavor, ',', ''))>=numbers.n-1) t

group by flavor

db<>fiddle中的演示

看看这个链接SQL split values to multiple rows

【讨论】:

以上是关于对于列中的每个字符串计算平均值(第二列)的主要内容,如果未能解决你的问题,请参考以下文章

spark示例:连接操作

Sumproduct 与 If(IsNumber(Search

计算R中列中NA的前后值的平均值

尝试根据 ID 计算一系列数据的平均值、最小值和最大值

根据第一列中的唯一值计算第二列中值的出现次数

R中前三个值的移动平均值