EVOLUTION-MANAGER
Edit File: query.editor.html
<query-editor-row query-ctrl="ctrl" has-text-edit-mode="true"> <div ng-if="ctrl.target.rawQuery"> <div class="gf-form-inline"> <div class="gf-form gf-form--grow"> <code-editor content="ctrl.target.rawSql" datasource="ctrl.datasource" on-change="ctrl.panelCtrl.refresh()" data-mode="sql"> </code-editor> </div> </div> </div> <div ng-if="!ctrl.target.rawQuery"> <div class="gf-form-inline"> <div class="gf-form"> <label class="gf-form-label query-keyword width-6">FROM</label> <metric-segment segment="ctrl.tableSegment" get-options="ctrl.getTableSegments()" on-change="ctrl.tableChanged()"></metric-segment> <label class="gf-form-label query-keyword width-7">Time column</label> <metric-segment segment="ctrl.timeColumnSegment" get-options="ctrl.getTimeColumnSegments()" on-change="ctrl.timeColumnChanged()"></metric-segment> <label class="gf-form-label query-keyword width-9"> Metric column <info-popover mode="right-normal">Column to be used as metric name for the value column.</info-popover> </label> <metric-segment segment="ctrl.metricColumnSegment" get-options="ctrl.getMetricColumnSegments()" on-change="ctrl.metricColumnChanged()"></metric-segment> </div> <div class="gf-form gf-form--grow"> <div class="gf-form-label gf-form-label--grow"></div> </div> </div> <div class="gf-form-inline" ng-repeat="selectParts in ctrl.selectParts"> <div class="gf-form"> <label class="gf-form-label query-keyword width-6"> <span ng-show="$index === 0">SELECT</span> </label> </div> <div class="gf-form" ng-repeat="part in selectParts"> <sql-part-editor class="gf-form-label sql-part" part="part" handle-event="ctrl.handleSelectPartEvent(selectParts, part, $event)"> </sql-part-editor> </div> <div class="gf-form"> <label class="dropdown" dropdown-typeahead2="ctrl.selectMenu" dropdown-typeahead-on-select="ctrl.addSelectPart(selectParts, $item, $subItem)" button-template-class="gf-form-label query-part" > </label> </div> <div class="gf-form gf-form--grow"> <div class="gf-form-label gf-form-label--grow"></div> </div> </div> <div class="gf-form-inline"> <div class="gf-form"> <label class="gf-form-label query-keyword width-6">WHERE</label> </div> <div class="gf-form" ng-repeat="part in ctrl.whereParts"> <sql-part-editor class="gf-form-label sql-part" part="part" handle-event="ctrl.handleWherePartEvent(ctrl.whereParts, part, $event, $index)"> </sql-part-editor> </div> <div class="gf-form"> <metric-segment segment="ctrl.whereAdd" get-options="ctrl.getWhereOptions()" on-change="ctrl.addWhereAction(part, $index)"></metric-segment> </div> <div class="gf-form gf-form--grow"> <div class="gf-form-label gf-form-label--grow"></div> </div> </div> <div class="gf-form-inline"> <div class="gf-form"> <label class="gf-form-label query-keyword width-6"> <span>GROUP BY</span> </label> <sql-part-editor ng-repeat="part in ctrl.groupParts" part="part" class="gf-form-label sql-part" handle-event="ctrl.handleGroupPartEvent(part, $index, $event)"> </sql-part-editor> </div> <div class="gf-form"> <metric-segment segment="ctrl.groupAdd" get-options="ctrl.getGroupOptions()" on-change="ctrl.addGroupAction(part, $index)"></metric-segment> </div> <div class="gf-form gf-form--grow"> <div class="gf-form-label gf-form-label--grow"></div> </div> </div> </div> <div class="gf-form-inline"> <div class="gf-form"> <label class="gf-form-label query-keyword">Format as</label> <div class="gf-form-select-wrapper"> <select class="gf-form-input gf-size-auto" ng-model="ctrl.target.format" ng-options="f.value as f.text for f in ctrl.formats" ng-change="ctrl.refresh()"></select> </div> </div> <div class="gf-form"> <label class="gf-form-label query-keyword pointer" ng-click="ctrl.toggleEditorMode()" ng-show="ctrl.panelCtrl.panel.type !== 'table'"> <span ng-show="ctrl.target.rawQuery">Query Builder</span> <span ng-hide="ctrl.target.rawQuery">Edit SQL</span> </label> </div> <div class="gf-form"> <label class="gf-form-label query-keyword pointer" ng-click="ctrl.showHelp = !ctrl.showHelp"> Show Help <i class="fa fa-caret-down" ng-show="ctrl.showHelp"></i> <i class="fa fa-caret-right" ng-hide="ctrl.showHelp"></i> </label> </div> <div class="gf-form" ng-show="ctrl.lastQueryMeta"> <label class="gf-form-label query-keyword pointer" ng-click="ctrl.showLastQuerySQL = !ctrl.showLastQuerySQL"> Generated SQL <i class="fa fa-caret-down" ng-show="ctrl.showLastQuerySQL"></i> <i class="fa fa-caret-right" ng-hide="ctrl.showLastQuerySQL"></i> </label> </div> <div class="gf-form gf-form--grow"> <div class="gf-form-label gf-form-label--grow"></div> </div> </div> <div class="gf-form" ng-show="ctrl.showLastQuerySQL"> <pre class="gf-form-pre">{{ctrl.lastQueryMeta.sql}}</pre> </div> <div class="gf-form" ng-show="ctrl.showHelp"> <pre class="gf-form-pre alert alert-info">Time series: - return column named time or time_sec (in UTC), as a unix time stamp or any sql native date data type. You can use the macros below. - return column(s) with numeric datatype as values Optional: - return column named <i>metric</i> to represent the series name. - If multiple value columns are returned the metric column is used as prefix. - If no column named metric is found the column name of the value column is used as series name Resultsets of time series queries need to be sorted by time. Table: - return any set of columns Macros: - $__time(column) -> UNIX_TIMESTAMP(column) as time_sec - $__timeEpoch(column) -> UNIX_TIMESTAMP(column) as time_sec - $__timeFilter(column) -> column BETWEEN FROM_UNIXTIME(1492750877) AND FROM_UNIXTIME(1492750877) - $__unixEpochFilter(column) -> time_unix_epoch > 1492750877 AND time_unix_epoch < 1492750877 - $__unixEpochNanoFilter(column) -> column >= 1494410783152415214 AND column <= 1494497183142514872 - $__timeGroup(column,'5m'[, fillvalue]) -> cast(cast(UNIX_TIMESTAMP(column)/(300) as signed)*300 as signed) by setting fillvalue grafana will fill in missing values according to the interval fillvalue can be either a literal value, NULL or previous; previous will fill in the previous seen value or NULL if none has been seen yet - $__timeGroupAlias(column,'5m') -> cast(cast(UNIX_TIMESTAMP(column)/(300) as signed)*300 as signed) AS "time" - $__unixEpochGroup(column,'5m') -> column DIV 300 * 300 - $__unixEpochGroupAlias(column,'5m') -> column DIV 300 * 300 AS "time" Example of group by and order by with $__timeGroup: SELECT $__timeGroupAlias(timestamp_col, '1h'), sum(value_double) as value FROM yourtable GROUP BY 1 ORDER BY 1 Or build your own conditionals using these macros which just return the values: - $__timeFrom() -> FROM_UNIXTIME(1492750877) - $__timeTo() -> FROM_UNIXTIME(1492750877) - $__unixEpochFrom() -> 1492750877 - $__unixEpochTo() -> 1492750877 - $__unixEpochNanoFrom() -> 1494410783152415214 - $__unixEpochNanoTo() -> 1494497183142514872 </pre> </div> </div> <div class="gf-form" ng-show="ctrl.lastQueryError"> <pre class="gf-form-pre alert alert-error">{{ctrl.lastQueryError}}</pre> </div> </query-editor-row>