# Aggregationの結果をfilterしたい

**URL:** <https://discuss.elastic.co/t/aggregation-filter/76357>\
**Category:** 日本語による質問・議論はこちら\
**Created:** [February 24, 2017, 6:30am UTC](https://discuss.elastic.co/t/aggregation-filter/76357 "2017-02-24T06:30:00Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![jbl4232000](https://avatars.discourse-cdn.com/v4/letter/j/2acd7d/32.png) [@jbl4232000](https://discuss.elastic.co/u/jbl4232000)\
**Post date:** [February 24, 2017, 6:30am UTC](https://discuss.elastic.co/t/aggregation-filter/76357/1 "2017-02-24T06:30:00Z")

</div>

Aggregationの対象をfilterするのではなく、Aggregationした結果をfilterしたいのですが可能でしょうか？  
SQL脳でもうしわけないですが、副問合せした結果にあるterms等で完全一致した複数の条件でしぼりたいというのが要件となります。

---

<div class="post-metadata">

**Author:** ![johtani](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/johtani/32/44956_2.png) [@johtani](https://discuss.elastic.co/u/johtani)\
**Post date:** [February 24, 2017, 7:26am UTC](https://discuss.elastic.co/t/aggregation-filter/76357/2 "2017-02-24T07:26:41Z")

</div>

[https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-terms-aggregation.html#\_filtering\_values\_with\_exact\_values](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-terms-aggregation.html#_filtering_values_with_exact_values)

こういう感じでしょうか？

---

<div class="post-metadata">

**Author:** ![jbl4232000](https://avatars.discourse-cdn.com/v4/letter/j/2acd7d/32.png) [@jbl4232000](https://discuss.elastic.co/u/jbl4232000)\
**Post date:** [February 24, 2017, 8:11am UTC](https://discuss.elastic.co/t/aggregation-filter/76357/3 "2017-02-24T08:11:02Z")

</div>

さっそくのご回答ありがとうございます。  
説明が悪かったので例を書いて説明させていただきます。  
カラム名はわかりやすいように日本語とさせてください。

```auto
所属テーブル
"properties" : {
    "ユーザID" : {
        "type" : "string"
     },
    "ユーザ名" : {
        "type" : "string"
     },
    "所属日" : {
         "type" : "date",
         "format" : "dateOptionalTime"
     },
    "所属コード" : {
        "type" : "string"
     }
}

```

というindexがあると想定します。所属が変わるたびにレコードができるテーブルです。  
データ例  
ユーザID,ユーザ名,所属日,所属コード  
001,日本 太郎,2016/01/16,0001  
001,日本 太郎,2016/02/16,0002  
001,日本 太郎,2016/03/16,0003  
001,日本 太郎,2016/04/16,0004  
002,日本 花子,2016/01/16,0001  
002,日本 花子,2016/02/16,0002  
002,日本 花子,2016/03/16,0005  
002,日本 花子,2016/04/16,0006  
・  
・  
・

この時に日付から何月何日にある所属の人は誰？ということを取得したいです。  
下記にて何月何日に所属していたところはどこというのは取得できます。

```auto
{
    "query" : {
        "filtered": {
            "filter": {
	          "range": {
		      "所属日": {
		             "lte": "2016/03/15"
		        }
		     }
             }
        }
    },
    "aggs": {
        "top-tags": {
            "terms": {
                "field": "ユーザID"
            },
            "aggs": {
                "top_tag_hits": {
                    "top_hits": {
                        "size" : 1
                    }
                }
            }
        }
    },
    size: 0
}

```

上記で取得して、取得した後にプログラムでそのなかである所属の人だけということで  
今実現してますが、それをいっぺんにできないかとのご相談です。  
（件数が多いのでElasticSearch側で絞ってしまいたい）

---

<div class="post-metadata">

**Author:** ![johtani](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/johtani/32/44956_2.png) [@johtani](https://discuss.elastic.co/u/johtani)\
**Post date:** [February 24, 2017, 9:10am UTC](https://discuss.elastic.co/t/aggregation-filter/76357/4 "2017-02-24T09:10:56Z")

</div>

いま、プログラムでどういうことをやられているのでしょうか？

---

<div class="post-metadata">

**Author:** ![jbl4232000](https://avatars.discourse-cdn.com/v4/letter/j/2acd7d/32.png) [@jbl4232000](https://discuss.elastic.co/u/jbl4232000)\
**Post date:** [February 25, 2017, 2:38am UTC](https://discuss.elastic.co/t/aggregation-filter/76357/5 "2017-02-25T02:38:19Z")

</div>

プログラムでは、上記のクエリで全ユーザ分のある日付の所属情報を全て取得した後、例えば営業部所属の人だけというのを全件ループさせながらチェックしてます。

件数が多いため、取得する通信に時間がかかっており、営業部所属の人だけをElasticSearch側だけで絞って処理速度の改善を行いたいと考えております。

SQLだと下記となると思うのですが、それとElasticSeachでも実現できないかと。

```auto
SELECT
  ユーザID,ユーザ名,所属日,所属コード
FROM 
  所属テーブル as a,
  (SELECT MAX(所属日) AS ユーザID FROM 所属テーブル GROUP BY ユーザID) a1
WHERE
    a.ユーザID = a1.ユーザID
  AND
   所属コード = '営業部' ・・・ ①

```

上記SQLをクエリで実現したく①の条件を付与することができずにいます。

---

<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:** [March 25, 2017, 2:38am UTC](https://discuss.elastic.co/t/aggregation-filter/76357/6 "2017-03-25T02:38:46Z")

</div>

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