Я думаю, что это может помочь:
{
"size": 0,
"aggs": {
"WeekAggergation": {
"date_histogram": {
"field": "date_of_sale",
"interval": "week",
"format": "yyyy-MM-dd"
},
"aggs": {
"TotalSales": {
"sum": {
"field": "sales"
}
},
"AvgSales": {
"avg": {
"field": "sales"
}
}
}
},
"avg_all_weekly_sales": {
"avg_bucket": {
"buckets_path": "WeekAggergation>TotalSales"
}
}
}
}
Обратите внимание, что агрегация TotalSales
теперь является вложенной агрегацией при еженедельной агрегации гистограммы (я полагаю, что в предоставленном коде была опечатка - простая схема предоставлена)указали имя поля date_of_sale
, а при агрегации используется форма множественного числа date_of_sales
).Это дает вам общее количество всех продаж в еженедельном сегменте.
Кроме того, AvgSales
обеспечивает аналогичное вложенное агрегирование при агрегировании по недельной гистограмме, поэтому вы можете увидеть среднее значение всех продаж, относящихся к этой неделе.
Наконец, конвейерная агрегация avg_all_weekly_sales
даст среднее значение еженедельных продаж на основе сегмента TotalSales
и количества непустых сегментов - если вы хотите включить пустые сегменты, добавьте параметр gap_policy
, например:так:
...
"avg_all_weekly_sales": {
"avg_bucket": {
"buckets_path": "WeekAggergation>TotalSales",
"gap_policy": "insert_zeros"
}
}
...
(см .: https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-pipeline-avg-bucket-aggregation.html).
Эта конвейерная агрегация может или не может быть тем, что вы на самом деле ищете, поэтому, пожалуйста, проверьте математику, чтобы убедиться, что результатожидается, но должен обеспечить правильный вывод на основе исходного сценария.