【发布时间】:2019-12-11 22:39:48
【问题描述】:
我有一个索引 transactions,其中包含 user_id、amount 和 category 字段。 我想计算每个用户和类别的平均金额,然后只获得每个类别的总平均金额。 SQL 如下所示:
SELET AVG(average), category from
(SELECT user_id, category, AVG(amount) AS average FROM transactions WHERE amount < 100000
GROUP BY user_id, category) AS a1
GROUP BY category
到目前为止,我只得到了一个包含所有用户 ID 的存储桶的响应,然后在其中,一个存储桶具有每个类别的平均金额(对于用户)。我不明白如何添加另一个聚合来做我所追求的。
{
"aggs": {
"group_by_users": {
"terms": {
"field": "user_id.keyword"
},
"aggs": {
"group_by_category": {
"terms": {
"field": "category.keyword"
},
"aggs": {
"average_amount": {
"avg": {
"field": "amount"
}
}
}
}
}
}
}
}
非常感谢任何帮助。
编辑:请求的示例因此这里首先是一些示例数据,然后是中间结果,该结果将以底部的所需结果结束。
-----------------------------------------
| user_id | category | amount |
-----------------------------------------
| 1 | insurances | 1000 |
| 1 | transport | 50 |
| 1 | transport | 100 |
| 2 | insurances | 700 |
| 2 | insurances | 200 |
| 2 | transport | 300 |
-----------------------------------------
计算用户 1 传输:(50+100)/2
因此,首先需要按 user_id 和类别进行分组,以获得每个用户和类别的平均值。
这将产生:
-----------------------------------------
| user_id | category | average |
-----------------------------------------
| 1 | insurances | 1000 |
| 1 | transport | 75 |
| 2 | insurances | 450 |
| 2 | transport | 300 |
-----------------------------------------
重要的是要了解我不能对所有用户进行平均,我首先需要每个用户、每个类别的平均支出。
所以现在我只想按类别分组并计算平均金额:
-----------------------------
| category | average |
-----------------------------
| insurances | 725 |
| transport | 187,5 |
-----------------------------
保险示例:(1000 + 450) / 2
【问题讨论】:
标签: elasticsearch