GlideAggregate 関数を使用してテーブルから MIN、MAX、AVG、SUM の値を取得する方法Summary次のサンプル関数を使用すると、テーブルフィールドから値の最小値、最大値、平均値、および合計値を簡単に取得できます。 GlideAggregate からの予期しない結果 デフォルトでは、GlideAggregate 関数は、指定された集計フィールドに対して GROUP BY と ORDER BY を実行します。たとえば、アクティブなインシデントの最新 (MAX) の作成日値を取得する場合は、次の GlideAggregate コードを実行できると考えます。 var ga = new GlideAggregate('incident');ga.addQuery('active=1');ga.addAggregate('MAX', 'sys_created_on');ga.query();if (ga.next()) { gs.log('Most recent Incident Created Date = ' + ga.getAggregate('MAX', 'sys_created_on'));} 次の出力が表示されます。 *** Script: Most recent Incident Created Date = 2014-03-10 20:43:10 これが間違っていることはわかっていますし、最近作成されたインシデントがあることもわかっているのに、何が起こっているのでしょうか? SQL デバッグ (System Diagnostics > Session Debug > Debug SQL) を有効にすると、生成されるクエリは次のようになります。 SELECT task0.`sys_created_on` AS `sys_created_on`, MAX(UNIX_TIMESTAMP(task0.`sys_created_on`) - UNIX_TIMESTAMP(19700101)) as max_of_970911560 FROM task task0 WHERE task0.`sys_class_name` = 'incident' AND task0.`active` = 1 GROUP BY task0.`sys_created_on` ORDER BY task0.`sys_created_on` これは最大の作成日値を取得していますが、個別の作成日値ごとに取得しています。これにより、非常に多くの異なる日付値になり、多くの行が返される可能性があります。実際、IFを削除してWHILEに置き換えると、何が起こっているのかをよりよく理解できます。 *** Script: Most recent Incident Created Date = 2014-03-10 20:43:10*** Script: Most recent Incident Created Date = 2015-08-25 23:41:54*** Script: Most recent Incident Created Date = 2015-11-02 20:49:08...*** Script: Most recent Incident Created Date = 2020-04-14 20:48:46*** Script: Most recent Incident Created Date = 2020-04-14 20:53:47*** Script: Most recent Incident Created Date = 2020-04-15 04:49:39 GROUP BYとORDER BYが原因で、フィールドが不要なグループ化されます。探している実際の最大値を取得するには、GlideAggregate 結果セットを反復処理し、最後の値を保存する必要があります。その結果セットにはメモリと時間を消費するレコードが多数存在する可能性があるため、これは理想的ではありません。今回のユースケースでは、GROUP BYとORDER BYは不要です。私が本当に欲しいのは、次のようなクエリを実行することです。 SELECT MAX(sys_created_on) FROM task WHERE task0.`sys_class_name` = 'incident' AND task0.`active` = 1; GROUP BY と ORDER BY の無効化 GROUP BY と ORDER BY は、次の GlideAggregate メソッドを使用して無効にできます。 setGroup(boolean) - Sets whether the results are to be groupedsetOrder(boolean) - Sets whether the results are to be sorted たとえば、コードを次のように書き直すことができます。 var ga = new GlideAggregate('incident');ga.addQuery('active=1');ga.addAggregate('MAX', 'sys_created_on');ga.setGroup(false);ga.setOrder(false);ga.query();while (ga.next()) { gs.log('Most recent Incident Created Date = ' + ga.getAggregate('MAX', 'sys_created_on'));} また、実行されるクエリには GROUP BY 句も ORDER BY 句もありません。 SELECT MAX(UNIX_TIMESTAMP(task0.`sys_created_on`) - UNIX_TIMESTAMP(19700101)) as max_of_970911560 FROM task task0 WHERE task0.`sys_class_name` = 'incident' AND task0.`active` = 1 そして、期待した結果を得ました: *** Script: Most recent Incident Created Date = 2020-04-15 04:49:39 また、データベースからアプリケーションサーバーに返される行は 1 つだけなので、大きな結果セットを格納するために多くのメモリが使用されることはありません。 ヘルパー関数 次のヘルパー関数を使用すると、最小値、最大値、平均値、合計値/合計値を簡単に取得できます。 function getAggregateByType(pTable, pColumn, pEncodedQuery, pAggregateType) { var ga = new GlideAggregate(pTable); if (pEncodedQuery) { ga.addQuery(pEncodedQuery); } ga.setGroup(false); ga.setOrder(false); ga.addAggregate(pAggregateType, pColumn); ga.query(); if (ga.next()) { return ga.getAggregate(pAggregateType, pColumn); } else { return null; }}function getMin(pTable, pColumn, pEncodedQuery) { return getAggregateByType(pTable, pColumn, pEncodedQuery, 'MIN');}function getMax(pTable, pColumn, pEncodedQuery) { return getAggregateByType(pTable, pColumn, pEncodedQuery, 'MAX');}function getAvg(pTable, pColumn, pEncodedQuery) { return getAggregateByType(pTable, pColumn, pEncodedQuery, 'AVG');}function getSum(pTable, pColumn, pEncodedQuery) { return getAggregateByType(pTable, pColumn, pEncodedQuery, 'SUM');} ユースケース/出力例 ユースケースの例をいくつか示します。 // Get the last time the admin user logged ings.print(getMax('sys_user', 'last_login', 'user_name=admin'));// Get the created date of the oldest active incidentgs.print(getMax('incident', 'sys_created_on', 'active=1'));// Get the average processing duration for events in the default event queuegs.print(getAvg('sysevent', 'processing_duration', 'queue=NULL')); 参照 GlideAggregatehttps://developer.servicenow.com/dev.do#!/reference/api/orlando/server_legacy/c_GlideAggregateAPI