栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

像GROUP BY AND HAVINg这样的SQL

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

像GROUP BY AND HAVINg这样的SQL

实现类似HAVINg的行为

您可以使用一种

pipelineaggregations
,即存储桶选择器聚合。查询如下所示:

POST my_index/tdrs/_search{   "aggregations": {      "reseller_sale_sum": {         "aggregations": { "sales": {    "sum": {       "field": "requestAmountValue"    } }, "max_sales": {    "bucket_selector": {       "buckets_path": {          "var1": "sales"       },       "script": "params.var1 > 10000"    } }         },         "terms": { "field": "senderResellerId", "order": {    "sales": "desc" }, "size": 5         }      }   },   "size": 0}

将以下文档放入索引后:

  "hits": [     {        "_index": "my_index",        "_type": "tdrs",        "_id": "AV9Yh5F-dSw48Z0DWDys",        "_score": 1,        "_source": {"requestAmountValue": 7000,"senderResellerId": "ID_1"        }     },     {        "_index": "my_index",        "_type": "tdrs",        "_id": "AV9Yh684dSw48Z0DWDyt",        "_score": 1,        "_source": {"requestAmountValue": 5000,"senderResellerId": "ID_1"        }     },     {        "_index": "my_index",        "_type": "tdrs",        "_id": "AV9Yh8TBdSw48Z0DWDyu",        "_score": 1,        "_source": {"requestAmountValue": 1000,"senderResellerId": "ID_2"        }     }  ]

查询的结果是:

"aggregations": {      "reseller_sale_sum": {         "doc_count_error_upper_bound": 0,         "sum_other_doc_count": 0,         "buckets": [ {    "key": "ID_1",    "doc_count": 2,    "sales": {       "value": 12000    } }         ]      }   }

即仅那些

senderResellerId
累计销售额为的者
>10000

数桶

要实现等效功能,

SELECT COUNT(*) FROM (...HAVINg)
可以结合使用桶脚本聚合和总和桶聚合。尽管似乎没有直接的方法来计算
bucket_selector
实际选择了多少个存储桶,但我们可以定义一个
bucket_script
产生
0
1
取决于条件的
sum_bucket
产生它的
sum

POST my_index/tdrs/_search{   "aggregations": {      "reseller_sale_sum": {         "aggregations": { "sales": {    "sum": {       "field": "requestAmountValue"    } }, "max_sales": {    "bucket_script": {       "buckets_path": {          "var1": "sales"       },       "script": "if (params.var1 > 10000) { 1 } else { 0 }"    } }         },         "terms": { "field": "senderResellerId", "order": {    "sales": "desc" }         }      },      "max_sales_stats": {         "sum_bucket": { "buckets_path": "reseller_sale_sum>max_sales"         }      }   },   "size": 0}

输出将是:

   "aggregations": {      "reseller_sale_sum": {         "doc_count_error_upper_bound": 0,         "sum_other_doc_count": 0,         "buckets": [ ...         ]      },      "max_sales_stats": {         "value": 1      }   }

所需的存储桶数位于中

max_sales_stats.value

重要注意事项

我必须指出两件事:

  1. 该功能是实验性的(从ES 5.6开始,它仍是实验性的,尽管它是在2.0.0-beta1中添加的。)
  2. 管道聚合应用于先前的聚合结果:

管道聚合工作于其他聚合而不是文档集所产生的输出,从而将信息添加到输出树中。

这意味着

bucket_selector
将在上的
terms
聚合结果之后和之后应用聚合
senderResellerId
。例如,如果聚合定义
senderResellerId
不止
size
一个
terms
,则不会使用来获得集合中的
所有 id
sum(sales) > 10000
,而只会获取出现在
terms
聚合输出中的id
。考虑使用排序和/或设置足够的
size
参数。

这也适用于第二种情况,

COUNT() (... HAVINg)
该情况仅计算聚合输出中实际存在的那些存储桶。

如果此查询太重或存储桶数太大,请考虑对数据进行规范化或将此总和直接存储在文档中,以便可以使用普通

range
查询来实现您的目标。

希望有帮助!



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/391972.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号