

Amazon Timestream for LiveAnalytics와 유사한 기능을 원하는 경우 Amazon Timestream for InfluxDB를 고려해 보세요. 간소화된 데이터 수집과 실시간 분석을 위한 10밀리초 미만의 쿼리 응답 시간을 제공합니다. [여기](https://docs.aws.amazon.com//timestream/latest/developerguide/timestream-for-influxdb.html)에서 자세히 알아보세요.

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 기본 제공 시계열 기능
<a name="timeseries-specific-constructs"></a>

Timestream for LiveAnalytics는 시계열 데이터를 첫 번째 클래스 개념으로 취급하는 기본 제공 시계열 기능을 제공합니다.

기본 제공 시계열 기능은 보기와 함수의 두 가지 범주로 나눌 수 있습니다.

아래에서 각 구문에 대해 읽을 수 있습니다.

**Topics**
+ [시계열 보기](timeseries-specific-constructs.views.md)
+ [시계열 함수](timeseries-specific-constructs.functions.md)

# 시계열 보기
<a name="timeseries-specific-constructs.views"></a>

Timestream for LiveAnalytics는 데이터를 `timeseries` 데이터 유형으로 변환하기 위해 다음 함수를 지원합니다.

**Topics**
+ [CREATE\$1TIME\$1SERIES](#timeseries-specific-constructs.views.CREATE_TIME_SERIES)
+ [UNNEST](#timeseries-specific-constructs.views.UNNEST)

## CREATE\$1TIME\$1SERIES
<a name="timeseries-specific-constructs.views.CREATE_TIME_SERIES"></a>

 **CREATE\$1TIME\$1SERIES**는 시계열의 모든 원시 측정값(시간 및 측정값 값)을 받아 시계열 데이터 유형을 반환하는 집계 함수입니다. 이 함수의 구문은 다음과 같습니다.

```
CREATE_TIME_SERIES(time, measure_value::<data_type>)
```

 여기서 `<data_type>`은 측정값의 데이터 유형이며 bigint, boolean, double 또는 varchar 중 하나일 수 있습니다. 두 번째 파라미터는 null일 수 없습니다.

아래와 같이 **지표**라는 테이블에 저장된 EC2 인스턴스의 CPU 사용률을 고려합니다.


| Time | 리전 | az | vpc | instance-id | measure\$1name | measure\$1value::double | 
| --- | --- | --- | --- | --- | --- | --- | 
|  2019-12-04 19:00:00.000000000  |  us-east-1  |  us-east-1d  |  vpc-1a2b3c4d  |  i-1234567890abcdef0  |  cpu\$1utilization  |  35.0  | 
|  2019-12-04 19:00:01.000000000  |  us-east-1  |  us-east-1d  |  vpc-1a2b3c4d  |  i-1234567890abcdef0  |  cpu\$1utilization  |  38.2  | 
|  2019-12-04 19:00:02.000000000  |  us-east-1  |  us-east-1d  |  vpc-1a2b3c4d  |  i-1234567890abcdef0  |  cpu\$1utilization  |  45.3  | 
|  2019-12-04 19:00:00.000000000  |  us-east-1  |  us-east-1d  |  vpc-1a2b3c4d  |  i-1234567890abcdef1  |  cpu\$1utilization  |  54.1  | 
|  2019-12-04 19:00:01.000000000  |  us-east-1  |  us-east-1d  |  vpc-1a2b3c4d  |  i-1234567890abcdef1  |  cpu\$1utilization  |  42.5  | 
|  2019-12-04 19:00:02.000000000  |  us-east-1  |  us-east-1d  |  vpc-1a2b3c4d  |  i-1234567890abcdef1  |  cpu\$1utilization  |  33.7  | 

쿼리 실행:

```
SELECT region, az, vpc, instance_id, CREATE_TIME_SERIES(time, measure_value::double) as cpu_utilization FROM metrics
    WHERE measure_name=’cpu_utilization’
    GROUP BY region, az, vpc, instance_id
```

측정값이 `cpu_utilization`인 모든 계열을 반환합니다. 이 경우 2개의 계열이 있습니다.


| 리전 | az | vpc | instance-id | cpu\$1utilization | 
| --- | --- | --- | --- | --- | 
|  us-east-1  |  us-east-1d  |  vpc-1a2b3c4d  |  i-1234567890abcdef0  |  [\$1time: 2019-12-04 19:00:00.000000000, measure\$1value::double: 35.0\$1, \$1time: 2019-12-04 19:00:01.000000000, measure\$1value::double: 38.2\$1, \$1time: 2019-12-04 19:00:02.000000000, measure\$1value::double: 45.3\$1]  | 
|  us-east-1  |  us-east-1d  |  vpc-1a2b3c4d  |  i-1234567890abcdef1  |  [\$1time: 2019-12-04 19:00:00.000000000, measure\$1value::double: 35.1\$1, \$1time: 2019-12-04 19:00:01.000000000, measure\$1value::double: 38.5\$1, \$1time: 2019-12-04 19:00:02.000000000, measure\$1value::double: 45.7\$1]  | 

## UNNEST
<a name="timeseries-specific-constructs.views.UNNEST"></a>

 `UNNEST`는 `timeseries` 데이터를 플랫 모델로 변환할 수 있는 테이블 함수입니다. 구문은 다음과 같습니다.

 `UNNEST`는 `timeseries`를 `time` 및 `value`의 두 열로 변환합니다. 아래와 같이 UNNEST와 함께 별칭을 사용할 수도 있습니다.

```
UNNEST(timeseries) AS <alias_name> (time_alias, value_alias)
```

여기서 `<alias_name>`은 플랫 테이블의 별칭이고, `time_alias`는 `time` 열의 별칭이고, `value_alias`는 `value` 열의 별칭입니다.

예를 들어 플릿의 일부 EC2 인스턴스가 5초 간격으로 지표를 내보내도록 구성되어 있고, 다른 인스턴스는 15초 간격으로 지표를 내보내며, 지난 6시간 동안 10초 단위로 모든 인스턴스의 평균 지표가 필요한 시나리오를 생각해 보세요. 이 데이터를 얻기 위해 **CREATE\$1TIME\$1SERIES**를 사용하여 지표를 시계열 모델로 변환합니다. 그런 다음 **INTERPOLATE\$1LINEAR**를 사용하여 10초 단위로 누락된 값을 가져올 수 있습니다. 그런 다음 **UNNEST**를 사용하여 데이터를 플랫 모델로 다시 변환한 다음 **AVG**를 사용하여 모든 인스턴스에서 평균 지표를 가져옵니다.

```
WITH interpolated_timeseries AS (
    SELECT region, az, vpc, instance_id,
        INTERPOLATE_LINEAR(
            CREATE_TIME_SERIES(time, measure_value::double),
                SEQUENCE(ago(6h), now(), 10s)) AS interpolated_cpu_utilization
    FROM timestreamdb.metrics 
    WHERE measure_name= ‘cpu_utilization’ AND time >= ago(6h)
    GROUP BY region, az, vpc, instance_id
)
SELECT region, az, vpc, instance_id, avg(t.cpu_util)
FROM interpolated_timeseries
CROSS JOIN UNNEST(interpolated_cpu_utilization) AS t (time, cpu_util)
GROUP BY region, az, vpc, instance_id
```

 위의 쿼리는 별칭과 함께 **UNNEST**를 사용하는 방법을 보여줍니다. 다음은 **UNNEST**에 별칭을 사용하지 않는 동일한 쿼리의 예입니다.

```
WITH interpolated_timeseries AS (
    SELECT region, az, vpc, instance_id,
        INTERPOLATE_LINEAR(
            CREATE_TIME_SERIES(time, measure_value::double),
                SEQUENCE(ago(6h), now(), 10s)) AS interpolated_cpu_utilization
    FROM timestreamdb.metrics 
    WHERE measure_name= ‘cpu_utilization’ AND time >= ago(6h)
    GROUP BY region, az, vpc, instance_id
)
SELECT region, az, vpc, instance_id, avg(value)
FROM interpolated_timeseries
CROSS JOIN UNNEST(interpolated_cpu_utilization)
GROUP BY region, az, vpc, instance_id
```

# 시계열 함수
<a name="timeseries-specific-constructs.functions"></a>

Amazon Timestream for LiveAnalytics는 미분, 정수, 상관관계 등의 시계열 함수를 지원하여 시계열 데이터에서 더 깊은 인사이트를 도출합니다. 이 섹션에서는 이러한 각 함수에 대한 사용 정보와 샘플 쿼리를 제공합니다. 자세히 알아보려면 아래 주제를 선택하세요.

**Topics**
+ [보간 함수](timeseries-specific-constructs.functions.interpolation.md)
+ [미분 함수](timeseries-specific-constructs.functions.derivatives.md)
+ [통합 함수](timeseries-specific-constructs.functions.integrals.md)
+ [상관관계 함수](timeseries-specific-constructs.functions.correlation.md)
+ [함수 필터링 및 축소](timeseries-specific-constructs.functions.filter-reduce.md)

# 보간 함수
<a name="timeseries-specific-constructs.functions.interpolation"></a>

특정 시점의 이벤트에 대한 시계열 데이터가 누락된 경우 보간을 사용하여 누락된 이벤트의 값을 추정할 수 있습니다. Amazon Timestream은 선형 보간, 3차 스플라인 보간, 마지막 관측값 전달(locf) 보간, 상수 보간의 네 가지 보간 변형을 지원합니다. 이 섹션에서는 Timestream for LiveAnalytics 보간 함수의 사용 정보와 샘플 쿼리를 제공합니다.



## 사용 정보
<a name="w2aab7c59c13c13c11b7"></a>


| 함수 | 출력 데이터 유형 | 설명 | 
| --- | --- | --- | 
|  `interpolate_linear(timeseries, array[timestamp])`  |  timeseries  |  [선형 보간](https://wikipedia.org/wiki/Linear_interpolation)을 사용하여 누락된 데이터를 채웁니다.  | 
|  `interpolate_linear(timeseries, timestamp)`  |  double  |  [선형 보간](https://wikipedia.org/wiki/Linear_interpolation)을 사용하여 누락된 데이터를 채웁니다.  | 
|  `interpolate_spline_cubic(timeseries, array[timestamp])`  |  timeseries  |  [3차 스플라인 보간](https://wikiversity.org/wiki/Cubic_Spline_Interpolation#:~:text=Cubic%20spline%20interpolation%20is%20a,Lagrange%20polynomial%20and%20Newton%20polynomial.)을 사용하여 누락된 데이터를 채웁니다.  | 
|  `interpolate_spline_cubic(timeseries, timestamp)`  |  double  |  [3차 스플라인 보간](https://wikiversity.org/wiki/Cubic_Spline_Interpolation#:~:text=Cubic%20spline%20interpolation%20is%20a,Lagrange%20polynomial%20and%20Newton%20polynomial.)을 사용하여 누락된 데이터를 채웁니다.  | 
|  `interpolate_locf(timeseries, array[timestamp])`  |  timeseries  |  마지막 샘플링된 값을 사용하여 누락된 데이터를 채웁니다.  | 
|  `interpolate_locf(timeseries, timestamp)`  |  double  |  마지막 샘플링된 값을 사용하여 누락된 데이터를 채웁니다.  | 
|  `interpolate_fill(timeseries, array[timestamp], double)`  |  timeseries  |  상수 값을 사용하여 누락된 데이터를 채웁니다.  | 
|  `interpolate_fill(timeseries, timestamp, double)`  |  double  |  상수 값을 사용하여 누락된 데이터를 채웁니다.  | 

## 쿼리 예제
<a name="w2aab7c59c13c13c11b9"></a>

**Example**  
지난 2시간 동안 특정 EC2 호스트에 대해 30초 간격으로 비닝된 평균 CPU 사용률을 찾아 선형 보간을 사용하여 누락된 값을 채웁니다.  

```
WITH binned_timeseries AS (
SELECT hostname, BIN(time, 30s) AS binned_timestamp, ROUND(AVG(measure_value::double), 2) AS avg_cpu_utilization
FROM "sampleDB".DevOps
WHERE measure_name = 'cpu_utilization'
    AND hostname = 'host-Hovjv'
    AND time > ago(2h)
GROUP BY hostname, BIN(time, 30s)
), interpolated_timeseries AS (
SELECT hostname,
    INTERPOLATE_LINEAR(
        CREATE_TIME_SERIES(binned_timestamp, avg_cpu_utilization),
            SEQUENCE(min(binned_timestamp), max(binned_timestamp), 15s)) AS interpolated_avg_cpu_utilization
FROM binned_timeseries
GROUP BY hostname
)
SELECT time, ROUND(value, 2) AS interpolated_cpu
FROM interpolated_timeseries
CROSS JOIN UNNEST(interpolated_avg_cpu_utilization)
```

**Example**  
지난 2시간 동안 특정 EC2 호스트에 대해 30초 간격으로 비닝된 평균 CPU 사용률을 찾아 마지막 관측치를 기준으로 보간을 사용하여 누락된 값을 채웁니다.  

```
WITH binned_timeseries AS (
SELECT hostname, BIN(time, 30s) AS binned_timestamp, ROUND(AVG(measure_value::double), 2) AS avg_cpu_utilization
FROM "sampleDB".DevOps
WHERE measure_name = 'cpu_utilization'
    AND hostname = 'host-Hovjv'
    AND time > ago(2h)
GROUP BY hostname, BIN(time, 30s)
), interpolated_timeseries AS (
SELECT hostname,
    INTERPOLATE_LOCF(
        CREATE_TIME_SERIES(binned_timestamp, avg_cpu_utilization),
            SEQUENCE(min(binned_timestamp), max(binned_timestamp), 15s)) AS interpolated_avg_cpu_utilization
FROM binned_timeseries
GROUP BY hostname
)
SELECT time, ROUND(value, 2) AS interpolated_cpu
FROM interpolated_timeseries
CROSS JOIN UNNEST(interpolated_avg_cpu_utilization)
```

# 미분 함수
<a name="timeseries-specific-constructs.functions.derivatives"></a>

미분은 지정된 지표에 대한 변경 속도를 계산하고 이벤트에 사전에 응답하는 데 사용할 수 있습니다. 예를 들어 지난 5분 동안 EC2 인스턴스의 CPU 사용률 미분을 계산하고 상당한 양의 미분을 발견했다고 가정해 보겠습니다. 이는 워크로드에 대한 수요 증가를 나타낼 수 있으므로 워크로드를 더 잘 처리하기 위해 더 많은 EC2 인스턴스를 가동할 수 있습니다.

Amazon Timestream은 미분 함수의 두 가지 변형을 지원합니다. 이 섹션에서는 Timestream for LiveAnalytics 미분 함수의 사용 정보와 샘플 쿼리를 제공합니다.



## 사용 정보
<a name="w2aab7c59c13c13c13b9"></a>


| 함수 | 출력 데이터 유형 | 설명 | 
| --- | --- | --- | 
|  `derivative_linear(timeseries, interval)`  |  timeseries  |  지정된 `interval`에 대해 `timeseries`에 있는 각 지점의 [미분](https://wikipedia.org/wiki/Derivative)을 계산합니다.  | 
|  `non_negative_derivative_linear(timeseries, interval)`  |  timeseries  |  `derivative_linear(timeseries, interval)`와 동일하지만 양수 값만 반환합니다.  | 

## 쿼리 예제
<a name="w2aab7c59c13c13c13c11"></a>

**Example**  
지난 1시간 동안 5분마다 CPU 사용률의 변화율을 확인합니다.  

```
SELECT DERIVATIVE_LINEAR(CREATE_TIME_SERIES(time, measure_value::double), 5m) AS result 
FROM “sampleDB”.DevOps 
WHERE measure_name = 'cpu_utilization' 
AND hostname = 'host-Hovjv' and time > ago(1h) 
GROUP BY hostname, measure_name
```

**Example**  
하나 이상의 마이크로서비스에서 생성된 오류의 증가율을 계산합니다.  

```
WITH binned_view as (
    SELECT bin(time, 5m) as binned_timestamp, ROUND(AVG(measure_value::double), 2) as value            
    FROM “sampleDB”.DevOps  
    WHERE micro_service = 'jwt'  
    AND time > ago(1h) 
    AND measure_name = 'service_error'
    GROUP BY bin(time, 5m)
)
SELECT non_negative_derivative_linear(CREATE_TIME_SERIES(binned_timestamp, value), 1m) as rateOfErrorIncrease
FROM binned_view
```

# 통합 함수
<a name="timeseries-specific-constructs.functions.integrals"></a>

정수를 사용하여 시계열 이벤트의 시간 단위당 곡선 아래 면적을 찾을 수 있습니다. 예를 들어 애플리케이션에서 수신한 요청의 양을 시간 단위별로 추적한다고 가정해 보겠습니다. 이 시나리오에서는 통합 함수를 사용하여 특정 기간 동안 지정된 간격당 제공된 총 요청 볼륨을 확인할 수 있습니다.

Amazon Timestream은 내장 함수의 한 가지 변형을 지원합니다. 이 섹션에서는 Timestream for LiveAnalytics 통합 함수의 사용 정보와 샘플 쿼리를 제공합니다.



## 사용 정보
<a name="w2aab7c59c13c13c15b9"></a>


| 함수 | 출력 데이터 유형 | 설명 | 
| --- | --- | --- | 
|  `integral_trapezoidal(timeseries(double))` `integral_trapezoidal(timeseries(double), interval day to second)` `integral_trapezoidal(timeseries(bigint))` `integral_trapezoidal(timeseries(bigint), interval day to second)` `integral_trapezoidal(timeseries(integer), interval day to second)` `integral_trapezoidal(timeseries(integer))`  |  double  |  제공된 `timeseries`에 대해 [사다리꼴 공식](https://wikipedia.org/wiki/Trapezoidal_rule)을 사용하여 지정된 `interval day to second`당 [적분](https://wikipedia.org/wiki/Integral)을 근사합니다. interval day to second 파라미터는 선택 사항이며 기본값은 `1s`입니다. 간격에 대한 자세한 내용은 [간격 및 기간](date-time-functions.md#date-time-functions-interval-duration) 섹션을 참조하세요.  | 

## 쿼리 예제
<a name="w2aab7c59c13c13c15c11"></a>

**Example**  
특정 호스트가 지난 1시간 동안 5분 동안 처리한 총 요청량을 계산합니다.  

```
SELECT INTEGRAL_TRAPEZOIDAL(CREATE_TIME_SERIES(time, measure_value::double), 5m) AS result FROM sample.DevOps 
WHERE measure_name = 'request' 
AND hostname = 'host-Hovjv' 
AND time > ago (1h) 
GROUP BY hostname, measure_name
```

# 상관관계 함수
<a name="timeseries-specific-constructs.functions.correlation"></a>

2개의 유사한 길이 시계열을 고려할 때 상관관계 함수는 상관관계 계수를 제공하여 시간 경과에 따른 두 시계열의 추세를 설명합니다. 상관 계수 범위는 `-1.0`\$1`1.0`입니다. `-1.0`은 두 시계열이 동일한 속도로 반대 방향으로 추세를 나타내고, `1.0`은 두 시계열이 동일한 속도로 동일한 방향으로 추세를 나타냅니다. 값 `0`은 두 시계열 간에 상관관계가 없음을 나타냅니다. 예를 들어, 오일 가격이 상승하고 오일 회사의 주가가 상승하는 경우 오일 가격 상승 추세와 오일 회사의 가격 상승 추세는 양의 상관 계수를 갖습니다. 양의 상관 계수가 높으면 두 가격의 추세가 비슷하다는 의미입니다. 마찬가지로 채권 가격과 채권 수익률 간의 상관 계수는 음수이며, 이는 이 두 값이 시간 경과에 따라 반대 방향으로 추세를 보이고 있음을 나타냅니다.

Amazon Timestream은 상관관계 함수의 두 가지 변형을 지원합니다. 이 섹션에서는 Timestream for LiveAnalytics 상관 함수의 사용 정보와 샘플 쿼리를 제공합니다.



## 사용 정보
<a name="w2aab7c59c13c13c19c11"></a>


| 함수 | 출력 데이터 유형 | 설명 | 
| --- | --- | --- | 
|  `correlate_pearson(timeseries, timeseries)`  |  double  |  두 `timeseries`에 대한 [Pearson의 상관 계수](https://wikipedia.org/wiki/Pearson_correlation_coefficient)를 계산합니다. 시계열에는 동일한 타임스탬프가 있어야 합니다.  | 
|  `correlate_spearman(timeseries, timeseries)`  |  double  |  두 `timeseries`에 대한 [Spearman의 상관 계수](https://en.wikipedia.org/wiki/Spearman%27s_rank_correlation_coefficient)를 계산합니다. 시계열에는 동일한 타임스탬프가 있어야 합니다.  | 

## 쿼리 예제
<a name="w2aab7c59c13c13c19c13"></a>

**Example**  

```
WITH cte_1 AS (
    SELECT INTERPOLATE_LINEAR(
        CREATE_TIME_SERIES(time, measure_value::double), 
        SEQUENCE(min(time), max(time), 10m)) AS result 
    FROM sample.DevOps 
    WHERE measure_name = 'cpu_utilization' 
    AND hostname = 'host-Hovjv' AND time > ago(1h) 
    GROUP BY hostname, measure_name
), 
cte_2 AS (
    SELECT INTERPOLATE_LINEAR(
        CREATE_TIME_SERIES(time, measure_value::double), 
        SEQUENCE(min(time), max(time), 10m)) AS result 
    FROM sample.DevOps 
    WHERE measure_name = 'cpu_utilization' 
    AND hostname = 'host-Hovjv' AND time > ago(1h) 
    GROUP BY hostname, measure_name
) 
SELECT correlate_pearson(cte_1.result, cte_2.result) AS result 
FROM cte_1, cte_2
```

# 함수 필터링 및 축소
<a name="timeseries-specific-constructs.functions.filter-reduce"></a>

Amazon Timestream은 시계열 데이터에 대한 필터를 수행하고 작업을 줄이기 위한 함수를 지원합니다. 이 섹션에서는 Timestream for LiveAnalytics 필터 및 감소 함수와 샘플 쿼리에 대한 사용 정보를 제공합니다.



## 사용 정보
<a name="w2aab7c59c13c13c23b7"></a>


| 함수 | 출력 데이터 유형 | 설명 | 
| --- | --- | --- | 
|  `filter(timeseries(T), function(T, Boolean))`  |  timeseries(T)  |  전달된 `function`이 `true`를 반환하는 값을 사용하여 입력 시계열에서 시계열을 구성합니다.  | 
|  `reduce(timeseries(T), initialState S, inputFunction(S, T, S), outputFunction(S, R))`  |  R  |  시계열에서 축소된 단일 값을 반환합니다. `inputFunction`은 각 요소에 대해 순서대로 시계열로 간접적으로 호출됩니다. 현재 요소를 가져오는 것 외에도 inputFunction은 현재 상태(처음에는 `initialState`)를 받아 새 상태를 반환합니다. `outputFunction`이 간접적으로 호출되어 최종 상태를 결과 값으로 바꿉니다. `outputFunction`은 항등 함수일 수 있습니다.  | 

## 쿼리 예제
<a name="w2aab7c59c13c13c23b9"></a>

**Example**  
측정값이 70보다 큰 호스트 및 필터 포인트의 CPU 사용률 시계열을 구성합니다.  

```
WITH time_series_view AS (
    SELECT INTERPOLATE_LINEAR(
        CREATE_TIME_SERIES(time, ROUND(measure_value::double,2)), 
            SEQUENCE(ago(15m), ago(1m), 10s)) AS cpu_user
    FROM sample.DevOps
    WHERE hostname = 'host-Hovjv' and measure_name = 'cpu_utilization'
        AND time > ago(30m)
    GROUP BY hostname
)
SELECT FILTER(cpu_user, x -> x.value > 70.0) AS cpu_above_threshold
from time_series_view
```

**Example**  
호스트의 CPU 사용률 시계열을 구성하고 측정값의 제곱 합계를 결정합니다.  

```
WITH time_series_view AS (
    SELECT INTERPOLATE_LINEAR(
        CREATE_TIME_SERIES(time, ROUND(measure_value::double,2)), 
            SEQUENCE(ago(15m), ago(1m), 10s)) AS cpu_user
    FROM sample.DevOps
    WHERE hostname = 'host-Hovjv' and measure_name = 'cpu_utilization'
        AND time > ago(30m)
    GROUP BY hostname
)
SELECT REDUCE(cpu_user,
    DOUBLE '0.0',
    (s, x) -> x.value * x.value + s,
    s -> s)
from time_series_view
```

**Example**  
호스트의 CPU 사용률 시계열을 구성하고 CPU 임곗값을 초과하는 샘플의 비율을 결정합니다.  

```
WITH time_series_view AS (
    SELECT INTERPOLATE_LINEAR(
        CREATE_TIME_SERIES(time, ROUND(measure_value::double,2)), 
            SEQUENCE(ago(15m), ago(1m), 10s)) AS cpu_user
    FROM sample.DevOps
    WHERE hostname = 'host-Hovjv' and measure_name = 'cpu_utilization'
        AND time > ago(30m)
    GROUP BY hostname
)
SELECT ROUND(
    REDUCE(cpu_user, 
      -- initial state 
      CAST(ROW(0, 0) AS ROW(count_high BIGINT, count_total BIGINT)),
      -- function to count the total points and points above a certain threshold
      (s, x) -> CAST(ROW(s.count_high + IF(x.value > 70.0, 1, 0), s.count_total + 1) AS ROW(count_high BIGINT, count_total BIGINT)),
      -- output function converting the counts to fraction above threshold
      s -> IF(s.count_total = 0, NULL, CAST(s.count_high AS DOUBLE) / s.count_total)), 
    4) AS fraction_cpu_above_threshold
from time_series_view
```