# Traducir un group by dentro de otro group by para obtener averages

**URL:** <https://discuss.elastic.co/t/traducir-un-group-by-dentro-de-otro-group-by-para-obtener-averages/153305>\
**Category:** Elastic en Español\
**Created:** [October 21, 2018, 10:02pm UTC](https://discuss.elastic.co/t/traducir-un-group-by-dentro-de-otro-group-by-para-obtener-averages/153305 "2018-10-21T22:02:30Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![enkil2003](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/enkil2003/32/36747_2.png) [@enkil2003](https://discuss.elastic.co/u/enkil2003)\
**Post date:** [October 21, 2018, 10:02pm UTC](https://discuss.elastic.co/t/traducir-un-group-by-dentro-de-otro-group-by-para-obtener-averages/153305/1 "2018-10-21T22:02:30Z")

</div>

No estoy pudiendo encontrar la solucion para algo que parece simple. Estoy traduciendo una busqueda de splunk que hace lo siguiente  
| bucket \_time span=1s | stats count by \_time marca operacion | stats min(count) as min,  
max(count) as max by marca operacion

Pero al haber dos "by", que seria similar a un group by, no puedo obtener el average minimo por operacion por marca. Esto se ejecuta en un lapso de 5 minutos. De momento mis aggregations lucen asi

```
{
  "aggs": {
    "tps": {
      "date_histogram": {
        "field": "@timestamp",
        "interval": "1s"
      }
    },
    "marca": {
      "terms": {
        "field": "marca",
        "size": 100
      },
      "aggs": {
        "operacion": {
          "filters": {
            "other_bucket_key": "marcaDos",
            "filters": {
              "marcaUno": {
                "exists": {
                  "field": "marcaUno"
                }
              }
            }
          }
        }
      }
    }
  }
}
```

---

<div class="post-metadata">

**Author:** ![gmoskovicz](https://avatars.discourse-cdn.com/v4/letter/g/ecae2f/32.png) [@gmoskovicz](https://discuss.elastic.co/u/gmoskovicz)\
**Post date:** [October 22, 2018, 1:30pm UTC](https://discuss.elastic.co/t/traducir-un-group-by-dentro-de-otro-group-by-para-obtener-averages/153305/2 "2018-10-22T13:30:53Z")

</div>

Hola!

Las agregaciones pueden ser en paralelo o hacia adentro. Entonces asi como `tps` y `marca` estan en paralelo, a dentro de `marca` podrias poner dos agregaciones.

De todas maneras estas bien rumbeado. `bucket_time` es Date Histogram, `stats count` es Terms, y luego min y max serian dos `Terms` con `size` 1, pero uno `sort` ascendente y el otro descendente. Entonces ahi podrias encontrar el maximo y minimo para esa operación si es que entiendo bien lo que estabas haciendo en splunk.

Saludos!  
--Gabriel

---

<div class="post-metadata">

**Author:** ![enkil2003](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/enkil2003/32/36747_2.png) [@enkil2003](https://discuss.elastic.co/u/enkil2003)\
**Post date:** [October 23, 2018, 5:33am UTC](https://discuss.elastic.co/t/traducir-un-group-by-dentro-de-otro-group-by-para-obtener-averages/153305/3 "2018-10-23T05:33:11Z")

</div>

Gracias por tu respuesta. Lo resolvi de esta manera. Pero como me comentas esto del order no se si esta bien mi solucion!, Me podes decir si ves algo raro?, son mas las cosas q necesito mas alla de min y max, como average y percentiles 50, 90 y 99

```
{
  "size": 0,
  "query": {...},
  "aggs": {
    "brands": {
      "terms": {
        "field": "marca",
        "size": 100
      },
      "aggs": {
        "operation": {
          "filters": {
            "other_bucket_key": "marcaDos",
            "filters": {
              "marcaUno": {
                "exists": {
                  "field": "marcaUno"
                }
              }
            }
          },
          "aggs": {
            "documentosPorSegundo": {
              "date_histogram": {
                "field": "@timestamp",
                "interval": "1s"
              }
            },
            "min": {
              "min_bucket": {
                "buckets_path": "documentosPorSegundo>_count"
              }
            },
            "max": {
              "max_bucket": {
                "buckets_path": "documentosPorSegundo>_count"
              }
            },
            "avg": {
              "avg_bucket": {
                "buckets_path": "documentosPorSegundo>_count"
              }
            }
          }
        }
      }
    }
  }
}
```

---

<div class="post-metadata">

**Author:** ![gmoskovicz](https://avatars.discourse-cdn.com/v4/letter/g/ecae2f/32.png) [@gmoskovicz](https://discuss.elastic.co/u/gmoskovicz)\
**Post date:** [October 23, 2018, 12:53pm UTC](https://discuss.elastic.co/t/traducir-un-group-by-dentro-de-otro-group-by-para-obtener-averages/153305/4 "2018-10-23T12:53:54Z")

</div>

> [@enkil2003](#):
>
> "exists": { "field": "marcaUno" }

Creo que aqui tienes que poner el exists como root del aggregation, y luego hacer el terms aggregation por `marca`. Tener en cuenta que aqui estarias encontrando el minimo y maximo de los top `100` documentos no de todo tu data set. Pero me parece que esto esta correcto tambien!

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/elastic/original/3X/1/a/1ac57faf039f6b580b3f104ef42a2a89e41014de.png) [@system](https://discuss.elastic.co/u/system)\
**Post date:** [November 20, 2018, 12:53pm UTC](https://discuss.elastic.co/t/traducir-un-group-by-dentro-de-otro-group-by-para-obtener-averages/153305/5 "2018-11-20T12:53:55Z")

</div>

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.
