查找SQL json列中值平均值的多列平均值

Posted

技术标签:

【中文标题】查找SQL json列中值平均值的多列平均值【英文标题】:Finding multiple column average of the average of values in SQL json column 【发布时间】:2018-07-12 23:39:24 【问题描述】:

假设我有一个包含以下格式数据的数据库


| id | name        | rating                                      |
-----------------------------------------------------------------|
| 1  | first       | "looks": 20, "quality": 20, "quantity": 20|
-----------------------------------------------------------------|
| 2  | second      | "looks": 30, "quality": 40, "quantity": 20|
------------------------------------------------------------------

首先,我需要获取 json 对象中每个项目的评分平均值。例如,获取 looksqualityquantity 的平均值,用于项目 firstsecond。第一项的平均评分为 20, 并且项目second 的平均评分为30。然后得到这两个项目的平均评分,即2030,最终结果为25。

我想使用 Laravel、Eloquent 查询构建器来实现它,但我不介意以原始 sql 格式获取它。我正在使用 Postgres 数据库。

我找到了this 答案,但它只使用单个键而不是多行来处理 json。任何帮助将不胜感激。

【问题讨论】:

你知道JSON列中的所有键吗? 是的,我知道所有的钥匙。它们对于所有行都是相同的。 您应该尝试在单独的列中进行此类计算 我同意...但是这已经在生产中的实时系统上。 虽然你得到了答案,但是对于 100 或 1000 行来说太慢了。 【参考方案1】:

你可以使用集合:

$collection = Model::get();
$ratings = $collection->map(function($i) 
    return collect(json_decode($i->rating))->avg();
);

并且您想在结果中添加平均评分:

$collection = Model::get();
$collection->transform(function($i) 
    $i->average = collect(json_decode($i->rating))->avg();
    return $i;
);

【讨论】:

是否可以在查询生成器中提供此解决方案?在调用 get 方法之前我可以在哪里过滤结果?

以上是关于查找SQL json列中值平均值的多列平均值的主要内容,如果未能解决你的问题,请参考以下文章

使用最后 n 个值的平均值或中值填充数据框不同列中的缺失值

BigQuery SQL:平均值、几何平均值、去除异常值、中值

excel怎么把一长列平均分成多列?

从 MYSQL 查询中计算列的平均值

如何找到R中分类列的平均值[关闭]

ORACLE每隔15分钟求一个平均值,怎么写sql?