HAVING 句
別の集約によって生成された出力に対して HAVING 句を使用します。この HAVING 句は、式に作用して応答に表示される間隔を決定します。式で指定したメトリックは数値にする必要があります。式は、HAVING 句が機能するブール値を返す必要があります。
さらに、HAVING 句は、次のようにクエリ内のエイリアスによって参照される必要があります。
SELECT customerName, count(*) as Requests, avg(responseTime) as ResponseTime FROM transactions HAVING Requests > 10000
この場合、Requests はクエリで参照されているエイリアスです。
構文
SELECT selectItems FROM relation WHERE where=booleanExpression SINCE statement HAVING havingClause ORDER BY sortItems LIMIT limits ;
ここで、havingClause は bloolean 式です。WHERE、ORDER BY、LIMIT 句と SINCE ステートメントはオプションです。
HAVING 句の例
以下のフィルタを使用した HAVING 句の例:
単純な比較フィルタ
SELECT transactionName, avg(responseTime) as AVRT FROM type HAVING AVRT > 0
単純な範囲フィルタ
SELECT transactionName, avg(responseTime) as AVRT FROM type HAVING AVRT BETWEEN [10, 90)
簡易リストフィルタ
SELECT transactionName, avg(responseTime) as AVRT FROM type HAVING AVRT IN (20, 30, 40, 60)
複合フィルタ
SELECT transactionName, avg(responseTime) as AVRT FROM type HAVING AVRT > 20 AND AVRT < 90 SELECT transactionName, avg(responseTime) as AVRT FROM type HAVING AVRT < 20 OR AVRT > 90 SELECT transactionName, avg(responseTime) as AVRT FROM type HAVING AVRT > 20 AND AVRT < 90 AND AVRT IN (70, 80)
NOT フィルタ
SELECT transactionName, avg(responseTime) as AVRT FROM type HAVING NOT AVRT > 50
NOT 複合フィルタ
SELECT transactionName, avg(responseTime) as AVRT FROM type HAVING NOT (AVRT > 20 AND AVRT < 90)
マルチメトリックフィルタ
SELECT transactionName, avg(responseTime) as AVRT, max(responseTime) as MAXRT FROM type HAVING NOT (AVRT > 20 AND AVRT < 90) AND MAXRT > 130
制限事項
HAVING 句は、次の場合はサポートされていません。
- Elasticsearch のネストされたフィールド
- 複数のメトリック関数(percentiles や stdev など)
- フィルタリングされたメトリック関数(フィルタ機能)
- 無効なクエリ:
| サポート対象外の条件/フィルタ | クエリ(Queries) |
|---|---|
| いいね! | SELECT transactionName, avg(responseTime) as AVRT FROM transactions HAVING AVRT LIKE '10' |
| Exists | SELECT transactionName, avg(responseTime) as AVRT FROM transactions HAVING AVRT IS NOT NULL |
| エイリアスなし |
SELECT avg(responseTime) as avtr FROM type HAVING avg(responseTime) > 10 SELECT txName, count(*), node, count(*) FROM transactions HAVING count(*) > 10 |
| ネスト | SELECT transactionId, AVG(segments.numCalls) as av_numCalls, MIN(segments.numCalls), MAX(segments.numCalls), SUM(segments.numCalls) FROM transactions HAVING av_numCalls > 2 |
| フィルタ機能 | SELECT appraisalrating, filter(min(salary), where salary > 60000) as val FROM transactions HAVING val > 60000 |
| 複数値のメトリック関数 | パーセンタイル: SELECT appraisalrating, percentile(salary, 94) as per_sal FROM transactions HAVING per_sal > 2 ORDER By appraisalrating 標準偏差 SELECT appraisalrating, stdev(salary) as stdev_sal FROM transactions HAVING stdev_sal > 2 ORDER By appraisalrating |
| 親集約がありません | SELECT avg(responseTime) as AVRT FROM transactions HAVING AVRT > 2 |
| 引用符で囲まれたエイリアス | SELECT series(eventTimestamp, "1d"), avg(responseTime/1000) AS "Response Time" FROM transactions WHERE transactionName = "TransactionName" HAVING "Response Time" > 50 |