2013-09-16 17:49:36 -04:00
|
|
|
---
|
2013-09-26 19:22:28 -04:00
|
|
|
layout: doc_page
|
2013-09-16 17:49:36 -04:00
|
|
|
---
|
2013-09-13 18:20:39 -04:00
|
|
|
A having clause is a JSON object identifying which rows from a groupBy query should be returned, by specifying conditions on aggregated values.
|
|
|
|
|
|
|
|
It is essentially the equivalent of the HAVING clause in SQL.
|
|
|
|
|
|
|
|
Druid supports the following types of having clauses.
|
|
|
|
|
|
|
|
### Numeric filters
|
|
|
|
|
|
|
|
The simplest having clause is a numeric filter.
|
|
|
|
Numeric filters can be used as the base filters for more complex boolean expressions of filters.
|
|
|
|
|
|
|
|
#### Equal To
|
|
|
|
|
|
|
|
The equalTo filter will match rows with a specific aggregate value.
|
|
|
|
The grammar for an `equalTo` filter is as follows:
|
|
|
|
|
|
|
|
<code>"having": {
|
|
|
|
"type": "equalTo",
|
|
|
|
"aggregation": <aggregate_metric>,
|
|
|
|
"value": <numeric_value>
|
|
|
|
}
|
|
|
|
</code>
|
|
|
|
|
|
|
|
This is the equivalent of `HAVING <aggregate> = <value>`.
|
|
|
|
|
|
|
|
#### Greater Than
|
|
|
|
|
|
|
|
The greaterThan filter will match rows with aggregate values greater than the given value.
|
|
|
|
The grammar for a `greaterThan` filter is as follows:
|
|
|
|
|
|
|
|
<code>"having": {
|
|
|
|
"type": "greaterThan",
|
|
|
|
"aggregation": <aggregate_metric>,
|
|
|
|
"value": <numeric_value>
|
|
|
|
}
|
|
|
|
</code>
|
|
|
|
|
|
|
|
This is the equivalent of `HAVING <aggregate> > <value>`.
|
|
|
|
|
|
|
|
#### Less Than
|
|
|
|
|
|
|
|
The lessThan filter will match rows with aggregate values less than the specified value.
|
|
|
|
The grammar for a `greaterThan` filter is as follows:
|
|
|
|
|
|
|
|
<code>"having": {
|
|
|
|
"type": "lessThan",
|
|
|
|
"aggregation": <aggregate_metric>,
|
|
|
|
"value": <numeric_value>
|
|
|
|
}
|
|
|
|
</code>
|
|
|
|
|
|
|
|
This is the equivalent of `HAVING <aggregate> < <value>`.
|
|
|
|
|
|
|
|
### Logical expression filters
|
|
|
|
|
|
|
|
#### AND
|
|
|
|
|
|
|
|
The grammar for an AND filter is as follows:
|
|
|
|
|
|
|
|
<code>"having": {
|
|
|
|
"type": "and",
|
|
|
|
"havingSpecs": [<having clause>, <having clause>, ...]
|
|
|
|
}
|
|
|
|
</code>
|
|
|
|
|
|
|
|
The having clauses in `havingSpecs` can be any other having clause defined on this page.
|
|
|
|
|
|
|
|
#### OR
|
|
|
|
|
|
|
|
The grammar for an OR filter is as follows:
|
|
|
|
|
|
|
|
<code>"having": {
|
|
|
|
"type": "or",
|
|
|
|
"havingSpecs": [<having clause>, <having clause>, ...]
|
|
|
|
}
|
|
|
|
</code>
|
|
|
|
|
|
|
|
The having clauses in `havingSpecs` can be any other having clause defined on this page.
|
|
|
|
|
|
|
|
#### NOT
|
|
|
|
|
|
|
|
The grammar for a NOT filter is as follows:
|
|
|
|
|
|
|
|
<code>"having": {
|
|
|
|
"type": "not",
|
|
|
|
"havingSpec": <having clause>
|
|
|
|
}
|
|
|
|
</code>
|
|
|
|
|
|
|
|
The having clause specified at `havingSpec` can be any other having clause defined on this page.
|