GlideAggregate を使用して MIN、MAX、AVG、SUM 値を取得する方法Summary<!-- /*NS Branding Styles*/ --> .ns-kb-css-body-editor-container { p { font-size: 12pt; font-family: Lato; color: var(--now-color--text-primary, #000000); } span { font-size: 12pt; font-family: Lato; color: var(--now-color--text-primary, #000000); } h2 { font-size: 24pt; font-family: Lato; color: var(--now-color--text-primary, black); } h3 { font-size: 18pt; font-family: Lato; color: var(--now-color--text-primary, black); } h4 { font-size: 14pt; font-family: Lato; color: var(--now-color--text-primary, black); } a { font-size: 12pt; font-family: Lato; color: var(--now-color--link-primary, #00718F); } a:hover { font-size: 12pt; color: var(--now-color--link-primary, #024F69); } a:target { font-size: 12pt; color: var(--now-color--link-primary, #032D42); } a:visited { font-size: 12pt; color: var(--now-color--link-primary, #00718f); } ul { font-size: 12pt; font-family: Lato; } li { font-size: 12pt; font-family: Lato; } img { display: ; max-width: ; width: ; height: ; } } GlideAggregate 関数を使用してテーブルフィールドから最小値、最大値、平均値、合計値を取得する方法を説明します。この記事では、予期しない結果を引き起こすデフォルトの GROUP BY 動作について説明し、集計クエリを簡素化するヘルパー関数を提供します。 GlideAggregate からの予期しない結果 デフォルトでは、GlideAggregate は指定された集計フィールドに対して GROUP BY と ORDER BY を実行します。この動作により、予期しない結果が発生する可能性があります。 シナリオ例 アクティブなインシデントの最新の (MAX) Created 日付値を取得するには、次のコードを使用する場合があります。 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` このクエリは、すべてのレコードにわたる単一の最大値ではなく、個別の Created 日付値ごとに最大の Created 日付値を返します。これにより、多数の行が返される可能性があります。 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 句により、不要なグループ化が発生します。実際の MAX 値を取得するには、結果セット全体を反復処理し、最後の値を保存する必要があります。結果セットには多数のレコードが含まれる可能性があり、メモリと時間を消費するため、このアプローチは非効率的です。 必要なクエリは次のとおりです: SELECT MAX(sys_created_on) FROM task WHERE task0.`sys_class_name` = 'incident' AND task0.`active` = 1; GROUP BY と ORDER BY の無効化 次の GlideAggregate メソッドを使用して、GROUP BY と ORDER BY 句を無効にします。 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 このアプローチは、データベースから単一の行のみを返すため、メモリ使用量を削減し、パフォーマンスを向上させます。 ヘルパー関数 最小値、最大値、平均値、合計値を取得するには、次のヘルパー関数を使用します: 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');} ユースケース/出力例 例1// Get the last time the admin user logged ings.print(getMax('sys_user', 'last_login', 'user_name=admin')); 例2// Get the created date of the oldest active incidentgs.print(getMax('incident', 'sys_created_on', 'active=1')); 例3// Get the average processing duration for events in the default event queuegs.print(getAvg('sysevent', 'processing_duration', 'queue=NULL')); 注: 2 番目の例では、最小の sys_created_on 値が最も早い作成日を表すため、最も古いインシデントを取得するために (getMax ではなく) getMin を使用します。 Release<!-- /*NS Branding Styles*/ --> .ns-kb-css-body-editor-container { p { font-size: 12pt; font-family: Lato; color: var(--now-color--text-primary, #000000); } span { font-size: 12pt; font-family: Lato; color: var(--now-color--text-primary, #000000); } h2 { font-size: 24pt; font-family: Lato; color: var(--now-color--text-primary, black); } h3 { font-size: 18pt; font-family: Lato; color: var(--now-color--text-primary, black); } h4 { font-size: 14pt; font-family: Lato; color: var(--now-color--text-primary, black); } a { font-size: 12pt; font-family: Lato; color: var(--now-color--link-primary, #00718F); } a:hover { font-size: 12pt; color: var(--now-color--link-primary, #024F69); } a:target { font-size: 12pt; color: var(--now-color--link-primary, #032D42); } a:visited { font-size: 12pt; color: var(--now-color--link-primary, #00718f); } ul { font-size: 12pt; font-family: Lato; } li { font-size: 12pt; font-family: Lato; } img { display: ; max-width: ; width: ; height: ; } } サポートされているすべてのリリース Related Links<!-- /*NS Branding Styles*/ --> .ns-kb-css-body-editor-container { p { font-size: 12pt; font-family: Lato; color: var(--now-color--text-primary, #000000); } span { font-size: 12pt; font-family: Lato; color: var(--now-color--text-primary, #000000); } h2 { font-size: 24pt; font-family: Lato; color: var(--now-color--text-primary, black); } h3 { font-size: 18pt; font-family: Lato; color: var(--now-color--text-primary, black); } h4 { font-size: 14pt; font-family: Lato; color: var(--now-color--text-primary, black); } a { font-size: 12pt; font-family: Lato; color: var(--now-color--link-primary, #00718F); } a:hover { font-size: 12pt; color: var(--now-color--link-primary, #024F69); } a:target { font-size: 12pt; color: var(--now-color--link-primary, #032D42); } a:visited { font-size: 12pt; color: var(--now-color--link-primary, #00718f); } ul { font-size: 12pt; font-family: Lato; } li { font-size: 12pt; font-family: Lato; } img { display: ; max-width: ; width: ; height: ; } } GlideAggregate (ServiceNow developer documentation)