# Aggregation後のデータの最新、最古の日付を取得したい

**URL:** <https://discuss.elastic.co/t/aggregation/286954>\
**Category:** 日本語による質問・議論はこちら\
**Created:** [October 18, 2021, 6:02am UTC](https://discuss.elastic.co/t/aggregation/286954 "2021-10-18T06:02:25Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![t-nakata](https://avatars.discourse-cdn.com/v4/letter/t/8491ac/32.png) [@t-nakata](https://discuss.elastic.co/u/t-nakata)\
**Post date:** [October 18, 2021, 6:02am UTC](https://discuss.elastic.co/t/aggregation/286954/1 "2021-10-18T06:02:25Z")

</div>

aggregationで、集約結果取得と同時にそれぞれの最新、最古の日付を取得できるかご教示ください。

例)  
以下のようなデータをclient\_ipにてaggregationします

client\_ip date  
10.192.1.1 2021/10/1  
10.192.1.1 2021/10/2  
10.192.1.1 2021/10/3  
10.192.1.2 2021/10/1  
10.192.1.2 2021/10/2  
10.192.1.2 2021/10/3  
10.192.1.3 2021/10/1

aggregation後の結果は以下になります。  
client\_ip num  
10.192.1.1 3  
10.192.1.2 3  
10.192.1.3 1

この時、さらにそれぞれのclient\_ipについて、最も早い日付と遅い日付をaggregation結果として取得したいです。  
例えば、10.192.1.1であれば、「2021/10/1」と「2021/10/3」をstart\_date、end\_dateとして取得したいです。このようなことは可能でしょうか？

---

<div class="post-metadata">

**Author:** ![tsgkdt](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/tsgkdt/32/39151_2.png) [@tsgkdt](https://discuss.elastic.co/u/tsgkdt)\
**Post date:** [October 18, 2021, 6:48am UTC](https://discuss.elastic.co/t/aggregation/286954/2 "2021-10-18T06:48:24Z")

</div>

client\_ipのaggregaionの下に、dateのmin, maxのaggregationを置くのはどうでしょうか？

```auto
POST test1/_search
{
  "query": {
    "match_all": {}
  },
  "size": 0, 
  "aggs": {
    "ip_addr": {
      "terms": {
        "field": "ip.keyword",
        "size": 10
      },
      "aggs": {
        "start_date" : {
          "min": {
            "field": "date"
          }
        },
        "end_date": {
          "max": {
            "field": "date"
          }
        }
      }
    }
  }
}

```

レスポンスイメージ  
client\_ipごと、それぞれで日付の最小、最大がセット取得できているかと思います。

```auto
{
  "took" : 4,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 7,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : []
  },
  "aggregations" : {
    "ip_addr" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "10.192.1.1",
          "doc_count" : 3,
          "end_date" : {
            "value" : 1.6332192E12,
            "value_as_string" : "2021-10-03"
          },
          "start_date" : {
            "value" : 1.6330464E12,
            "value_as_string" : "2021-10-01"
          }
        },
        {
          "key" : "10.192.1.2",
          "doc_count" : 3,
          "end_date" : {
            "value" : 1.6332192E12,
            "value_as_string" : "2021-10-03"
          },
          "start_date" : {
            "value" : 1.6330464E12,
            "value_as_string" : "2021-10-01"
          }
        },
        {
          "key" : "10.192.1.3",
          "doc_count" : 1,
          "end_date" : {
            "value" : 1.6330464E12,
            "value_as_string" : "2021-10-01"
          },
          "start_date" : {
            "value" : 1.6330464E12,
            "value_as_string" : "2021-10-01"
          }
        }
      ]
    }
  }
}

```

ご参考になれば幸いです

---

<div class="post-metadata">

**Author:** ![t-nakata](https://avatars.discourse-cdn.com/v4/letter/t/8491ac/32.png) [@t-nakata](https://discuss.elastic.co/u/t-nakata)\
**Post date:** [October 18, 2021, 8:59am UTC](https://discuss.elastic.co/t/aggregation/286954/3 "2021-10-18T08:59:21Z")

</div>

早々のご回答ありがとうございます。頂いた方法にて実現できそうです。  
ちなみにもう一つご存じでしたら教えてください。aggregationした結果をキーにドキュメントを再検索し、データを取得したいです。実現可能でしょうか？

上記データで、client\_ipでaggregationした結果、numが3以上のデータを取得したいです。1つのクエリの中で実現させたいのですが可能でしょうか？  
＜元データ＞  
10.192.1.1 2021/10/1  
10.192.1.1 2021/10/2  
10.192.1.1 2021/10/3  
10.192.1.2 2021/10/1  
10.192.1.2 2021/10/2  
10.192.1.2 2021/10/3  
10.192.1.3 2021/10/1  
↓  
＜client\_ipでaggregationし、numが3以上のclient\_ipのデータのみ取得＞  
10.192.1.1 2021/10/1  
10.192.1.1 2021/10/2  
10.192.1.1 2021/10/3  
10.192.1.2 2021/10/1  
10.192.1.2 2021/10/2  
10.192.1.2 2021/10/3

---

<div class="post-metadata">

**Author:** ![tsgkdt](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/tsgkdt/32/39151_2.png) [@tsgkdt](https://discuss.elastic.co/u/tsgkdt)\
**Post date:** [October 18, 2021, 3:37pm UTC](https://discuss.elastic.co/t/aggregation/286954/4 "2021-10-18T15:37:00Z")

</div>

bucket selectorではどうでしょうか？  
下記の例のipaddr\_bucket\_filterの箇所を確認してみてください。

```auto
{
  "query": {
    "match_all": {}
  },
  "size": 0,
  "aggs": {
    "ip_addr": {
      "terms": {
        "field": "ip.keyword",
        "size": 10
      },
      "aggs": {
        "ipaddr_bucket_filter": {
          "bucket_selector": {
            "buckets_path": {
              "ip_addr_count": "_count"
            },
            "script": "params.ip_addr_count >= 3"
          }
        },
        "start_date": {
          "min": {
            "field": "date"
          }
        },
        "end_date": {
          "max": {
            "field": "date"
          }
        }
      }
    }
  }
}

```

今回は、 \>=3 を指定しているので、10.192.1.3に対する結果がフィルタリングされて出ていないことが確認できるかと思います。

実行結果の一部を転記します

```auto
"aggregations" : {
    "ip_addr" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "10.192.1.1",
          "doc_count" : 3,
          "end_date" : {
            "value" : 1.6332192E12,
            "value_as_string" : "2021-10-03"
          },
          "start_date" : {
            "value" : 1.6330464E12,
            "value_as_string" : "2021-10-01"
          }
        },
        {
          "key" : "10.192.1.2",
          "doc_count" : 3,
          "end_date" : {
            "value" : 1.6332192E12,
            "value_as_string" : "2021-10-03"
          },
          "start_date" : {
            "value" : 1.6330464E12,
            "value_as_string" : "2021-10-01"
          }
        }
      ]
    }
  }

```

公式だと、こちら

> **[Bucket selector aggregation | Elasticsearch Guide \[master\] | Elastic](https://www.elastic.co/guide/en/elasticsearch/reference/master/search-aggregations-pipeline-bucket-selector-aggregation.html)**

簡単に動作イメージをつかむ場合は、こちらが参考になるかと思います

> **[ElasticsearchでAggregationの結果に対する絞り込み(SQLのHAVING句)を行う - Qiita](https://qiita.com/NAO_MK2/items/7cac185abe533b5d8ce4)**
>
> Bucket Selector Aggregationを使うことでElasticsearchのAggregationの結果に対する絞り込み、SQLで言うところのHAVING句を実現できます。
> 
> 
> 環境
> 
> Elasticsearch 6...

---

<div class="post-metadata">

**Author:** ![t-nakata](https://avatars.discourse-cdn.com/v4/letter/t/8491ac/32.png) [@t-nakata](https://discuss.elastic.co/u/t-nakata)\
**Post date:** [October 19, 2021, 5:47am UTC](https://discuss.elastic.co/t/aggregation/286954/5 "2021-10-19T05:47:20Z")

</div>

すみません、表現が分かりづらかったです。  
aggregationした結果、numが3以上のデータを取得し、それをキーにもう一度クエリしたいという意図でした。

■元データ

```auto
    "hits" : [
      {
        "_index" : "poc_test",
        "_type" : "doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "client_ip" : "10.192.1.1",
          "date" : "2021/10/1"
        }
      },
      {
        "_index" : "poc_test",
        "_type" : "doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "client_ip" : "10.192.1.1",
          "date" : "2021/10/2"
        }
      },
      {
        "_index" : "poc_test",
        "_type" : "doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "client_ip" : "10.192.1.1",
          "date" : "2021/10/3"
        }
      }.
      {
        "_index" : "poc_test",
        "_type" : "doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "client_ip" : "10.192.1.2",
          "date" : "2021/10/1"
        }
      }
    ]

```

これを、client\_ipでaggregatuionし、numが3以上のもの(10.192.1.1)を条件に再検索し、データを抽出したいです。最終的に以下のような形で抽出したいです。

```auto
    "hits" : [
      {
        "_index" : "poc_test",
        "_type" : "doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "client_ip" : "10.192.1.1",
          "date" : "2021/10/1"
        }
      },
      {
        "_index" : "poc_test",
        "_type" : "doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "client_ip" : "10.192.1.1",
          "date" : "2021/10/2"
        }
      },
      {
        "_index" : "poc_test",
        "_type" : "doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "client_ip" : "10.192.1.1",
          "date" : "2021/10/3"
        }
      }
    ]

```

---

<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 16, 2021, 5:47am UTC](https://discuss.elastic.co/t/aggregation/286954/6 "2021-11-16T05:47:59Z")

</div>

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