카테고리:

쿼리 구문

RESAMPLE

사용자가 정의한 시간 기반 세분성이 주어진 경우, 누락된 데이터 요소에 대해 생성된 행과 입력 행을 모두 포함하는 데이터 세트를 반환합니다.

구문

FROM <object_reference> [ [ AS ] <alias_name> ]
  RESAMPLE(
    USING <time_series_column>
    INCREMENT BY <time_series_constant>
    [ PARTITION BY <partition_column> [ , ... ] ]
    [ METADATA_COLUMNS
        { IS_GENERATED() | BUCKET_START() } [ [ AS ] <alias_name> ] [ , ... ] ]
    )
Copy

필수 매개 변수

FROM object_reference

하위 쿼리와 같은 입력 데이터 세트를 포함하는 테이블 또는 다른 오브젝트 참조의 이름을 지정합니다. 오브젝트 참조에 대한 자세한 내용은 FROM 섹션을 참조하세요.

USING time_series_column

시계열의 시간 기반 값이 포함된 열을 지정합니다. 열은 날짜 및 시간 데이터 타입 또는 :doc:`숫자 데이터 타입</sql-reference/data-types-numeric>`이어야 합니다. 예를 들어, UNIX 타임스탬프 값은 NUMBER(38,0) 열에 저장될 수 있으며, 여기서 ``1743447600``은 ``2025-3-31 12:00:00``과 동일합니다.

INCREMENT BY time_series_constant

USING 열의 데이터 타입에 따라 INTERVAL 상수 또는 숫자 상수를 지정합니다. 이 상수는 각 시간 간격의 너비를 나타냅니다. 모든 조각은 1970년 1월 1일 자정(1970-01-01 00:00:00)을 기준으로 정렬됩니다. TIME_SLICE 함수는 동일한 정렬을 사용합니다. 자세한 내용은 TIME_SLICE 사용법 노트 섹션을 참조하세요.

  • USING 매개 변수가 날짜 또는 시간 열을 지정할 때 INCREMENT BY 표현식은 :ref:`INTERVAL 상수<label-interval_constants>`여야 합니다.

  • USING 매개 변수가 숫자 열을 지정할 때 INCREMENT BY 표현식은 숫자여야 합니다.

생성된 시계열의 시작점은 :samp:`{time_series_constant}`의 최소 시간을 기준으로 합니다.

이 상수가 숫자 상수인 경우 양수(0보다 큼)여야 합니다.

선택적 매개 변수

[ AS ] alias_name

오브젝트 참조의 대체 이름을 지정합니다. 별칭은 FROM 절 내의 다른 모든 하위 절에서 사용할 수 있습니다. 별칭 이름은 오브젝트 식별자 규칙을 따라야 합니다.

PARTITION BY partition_column

하나 이상의 입력 열에서 결과 세트를 분할하고 각 파티션 내에 새 행을 생성합니다.

METADATA_COLUMNS {function} [ [ AS ] {alias_name} ]

리샘플링된 결과 세트에 하나 이상의 메타데이터 열을 추가합니다. 열을 추가하려면 다음 함수 중 하나 또는 둘 다를 호출합니다.

IS_GENERATED()

결과 세트에 RESAMPLE 작업으로 생성된 새 행과 이미 존재하는 행을 표시하는 is_generated 열을 추가합니다.

BUCKET_START()

bucket_start 열을 결과 세트에 추가합니다. 이 열은 USING 절에 지정된 열의 값을 기반으로 RESAMPLE 작업이 생성하는 현재 버킷 또는 간격의 시작을 표시하는 값을 반환합니다. BUCKET_START 열을 사용하여 리샘플링 후 특정 행이 속한 간격을 식별합니다.

두 메타데이터 열을 모두 지정하는 경우 쉼표로 구분합니다.

생성된 열에는 별칭이 있을 수 있습니다. 별칭 이름은 오브젝트 식별자 규칙을 따라야 합니다.

사용법 노트

  • INCREMENT BY 절의 INTERVAL 상수에 대한 요구 사항은 다음과 같습니다.

    • 상수는 1``second`` 이상이어야 합니다. 더 작은 단위(millisecond, microsecond, nanosecond)는 지원되지 않습니다.

    • USING 열이 DATE 데이터 타입인 경우, 간격에서``day``(hour, minute, second)보다 세분화된 단위를 지정할 수 없습니다. 예를 들어, 상수 'INTERVAL 1 day, 2 hours'``’INTERVAL 25 hours’``는 허용되지 않습니다.

    • 모호성을 피하기 위해 특정 날짜 부분을 혼합할 수 없습니다. 지원되는 날짜 부분은 다음 세 가지 개별 그룹으로 나뉩니다.

      • year, quarter, month

      • week

      • day, hour, minute, second

      예를 들어, 이러한 그룹 경계를 가로지르는 다음 간격은 허용되지 않습니다.

      • INTERVAL '1 week, 3 days'

      • INTERVAL '2 weeks, 12 hours'

      • INTERVAL '3 months, 1 week'

  • 조인과 관련하여, RESAMPLE 구성은 SAMPLE / TABLESAMPLE 구성과 유사한 방식으로 작동합니다 리샘플링은 이전의 모든 테이블이나 RESAMPLE 절 이전의 전체 표현식이 아니라 하나의 테이블에만 적용됩니다. 조인 결과를 리샘플링하려면 조인에 대한 하위 쿼리를 사용한 다음 결과 테이블을 리샘플링합니다. 조인으로 샘플링하기 섹션을 참조하십시오.

  • RESAMPLE 절은 WHERE 절 조건이 적용되기 전에 평가됩니다. 필터링된 데이터 세트를 리샘플링하려면 먼저 데이터 세트를 필터링합니다(예: 리샘플링할 수 있는 새 테이블을 생성하거나 기본 RESAMPLE 쿼리 내부에서 먼저 계산되는 하위 쿼리를 사용). 다음 쿼리는 전체 테이블을 리샘플링한 다음 Atlanta``Boston``에 대한 행을 제외한 모든 항목을 삭제합니다.

    SELECT *
      FROM heavy_weather
        RESAMPLE(
          USING start_time
          INCREMENT BY INTERVAL '1 day')
      WHERE city IN('Atlanta','Boston')
      ORDER BY start_time, city, county;
    
    Copy

    하위 쿼리를 사용한 잠재적인 재작성은 다음과 같습니다.

    SELECT *
      FROM (SELECT * FROM heavy_weather WHERE city IN('Atlanta','Boston'))
        RESAMPLE(
          USING start_time
          INCREMENT BY INTERVAL '1 day')
      ORDER BY start_time, city, county;
    
    Copy

다음 예에서는 쿼리에서 RESAMPLE 구성을 사용하는 방법을 보여줍니다.

숫자 열을 사용하는 RESAMPLE 예제

다음 예제에서는 소스 테이블에 UNIX 타임스탬프가 있습니다. 이 숫자 열은 RESAMPLE 절에서 USING 열로 지정됩니다. 다음 테이블을 만들고 로드합니다.

CREATE OR REPLACE TABLE sensor_data_unixtime (device_id VARCHAR(10), unixtime NUMBER(38,0), avg_temp NUMBER(6,4), vibration NUMBER (5,4), motor_rpm INT);

INSERT INTO sensor_data_unixtime VALUES
  ('DEVICE3', 1696150802, 36.1103, 0.4226, 1560),
  ('DEVICE3', 1696150803, 35.2987, 0.4326, 1561),
  ('DEVICE3', 1696150804, 40.0001, 0.3221, 1562),
  ('DEVICE3', 1696150805, 38.0422, 0.3333, 1589),
  ('DEVICE3', 1696150807, 33.1524, 0.4865, 1499),
  ('DEVICE3', 1696150808, 32.0422, 0.4221, 1498),
  ('DEVICE3', 1696150809, 31.1519, 0.4751, 1600),
  ('DEVICE3', 1696150810, 29.1524, 0.4639, 1605),
  ('DEVICE3', 1696150812, 35.2987, 0.4336, 1585),
  ('DEVICE3', 1696150813, 40.0000, 0.4226, 1560)
;
Copy

이제 다음 RESAMPLE 쿼리를 실행합니다.

SELECT * FROM sensor_data_unixtime
  RESAMPLE(USING unixtime INCREMENT BY 1) ORDER BY unixtime;
Copy
+-----------+------------+----------+-----------+-----------+
| DEVICE_ID |   UNIXTIME | AVG_TEMP | VIBRATION | MOTOR_RPM |
|-----------+------------+----------+-----------+-----------|
| DEVICE3   | 1696150802 |  36.1103 |    0.4226 |      1560 |
| DEVICE3   | 1696150803 |  35.2987 |    0.4326 |      1561 |
| DEVICE3   | 1696150804 |  40.0001 |    0.3221 |      1562 |
| DEVICE3   | 1696150805 |  38.0422 |    0.3333 |      1589 |
| DEVICE3   | 1696150806 |     NULL |      NULL |      NULL |
| DEVICE3   | 1696150807 |  33.1524 |    0.4865 |      1499 |
| DEVICE3   | 1696150808 |  32.0422 |    0.4221 |      1498 |
| DEVICE3   | 1696150809 |  31.1519 |    0.4751 |      1600 |
| DEVICE3   | 1696150810 |  29.1524 |    0.4639 |      1605 |
| DEVICE3   | 1696150811 |     NULL |      NULL |      NULL |
| DEVICE3   | 1696150812 |  35.2987 |    0.4336 |      1585 |
| DEVICE3   | 1696150813 |  40.0000 |    0.4226 |      1560 |
+-----------+------------+----------+-----------+-----------+

USING 열이 숫자인 경우 INCREMENT BY 표현식은 양의 숫자 상수여야 하므로 다음 쿼리는 실패합니다.

SELECT * FROM sensor_data_unixtime
  RESAMPLE(USING unixtime INCREMENT BY INTERVAL '1 second') ORDER BY unixtime;
Copy
009954 (42601): SQL compilation error:
RESAMPLE INCREMENT BY has to be numeric type when USING parameter is numeric.

생성된 행만 반환하는 RESAMPLE 예제

다음 예제에서는 march_temps 테이블(label-using-the-resample-clause`에서 생성됨)을 리샘플링하고 결과에 ``generated_row```bucket_start``라는 메타데이터 열을 포함합니다.

CREATE OR REPLACE TABLE march_temps_every_five_mins AS
  SELECT * FROM march_temps
    RESAMPLE(
      USING observed
      INCREMENT BY INTERVAL '5 minutes'
      PARTITION BY city, county
      METADATA_COLUMNS IS_GENERATED() AS generated_row, BUCKET_START()
      )
  ORDER BY observed;
Copy

다음 쿼리는 march_temps_every_five_mins 테이블에서 생성된 행만 반환합니다.

SELECT * FROM march_temps_every_five_mins
  WHERE generated_row = 'True';
Copy
+-------------------------+-------------+------------------+----------------+---------------+-------------------------+
| OBSERVED                | TEMPERATURE | CITY             | COUNTY         | GENERATED_ROW | BUCKET_START            |
|-------------------------+-------------+------------------+----------------+---------------+-------------------------|
| 2025-03-15 09:45:00.000 |        NULL | Big Bear City    | San Bernardino | True          | 2025-03-15 09:45:00.000 |
| 2025-03-15 09:50:00.000 |        NULL | Big Bear City    | San Bernardino | True          | 2025-03-15 09:50:00.000 |
| 2025-03-15 10:00:00.000 |        NULL | South Lake Tahoe | El Dorado      | True          | 2025-03-15 10:00:00.000 |
| 2025-03-15 10:00:00.000 |        NULL | Big Bear City    | San Bernardino | True          | 2025-03-15 10:00:00.000 |
| 2025-03-15 10:05:00.000 |        NULL | South Lake Tahoe | El Dorado      | True          | 2025-03-15 10:05:00.000 |
| 2025-03-15 10:05:00.000 |        NULL | Big Bear City    | San Bernardino | True          | 2025-03-15 10:05:00.000 |
| 2025-03-15 10:15:00.000 |        NULL | Big Bear City    | San Bernardino | True          | 2025-03-15 10:15:00.000 |
+-------------------------+-------------+------------------+----------------+---------------+-------------------------+

BUCKET_START()를 사용하여 리샘플링된 행을 집계하는 RESAMPLE 예제

다음 예제에서는 bucket_start 메타데이터 열을 사용하여 리샘플링된 행을 집계합니다. 쿼리는 1일 간격으로 증분되는 리샘플링된 결과 세트가 주어지면 버킷 시작 시간이 동일한 도시당 관측값 수를 계산합니다. 이 예제를 실행하려면 :ref:`label-using-the-resample-clause`에 설명된 대로 ``march_temps``테이블을 만듭니다.

SELECT bucket_start, county, COUNT(*)
  FROM march_temps
    RESAMPLE(
      USING observed
      INCREMENT BY INTERVAL '1 day'
      METADATA_COLUMNS IS_GENERATED(), BUCKET_START()
      )
  WHERE IS_GENERATED = 'False'
  GROUP BY bucket_start, county;
Copy
+-------------------------+----------------+----------+
| BUCKET_START            | COUNTY         | COUNT(*) |
|-------------------------+----------------+----------|
| 2025-03-15 00:00:00.000 | El Dorado      |        4 |
| 2025-03-15 00:00:00.000 | San Bernardino |        4 |
+-------------------------+----------------+----------+

BUCKET_START()를 사용하여 균일하지 않은 행을 필터링하는 RESAMPLE 예제

bucket_start 메타데이터 열을 사용하여 리샘플링된 결과 세트에서 균일하지 않은 데이터를 필터링할 수 있습니다. 예:

SELECT *
  FROM march_temps
    RESAMPLE(
      USING observed
      INCREMENT BY INTERVAL '5 minutes'
      METADATA_COLUMNS BUCKET_START() AS bucket_first_row
      )
  WHERE observed = bucket_first_row
  ORDER BY observed;
Copy

이 쿼리는 테이블을 리샘플링한 다음, 5분 간격을 준수하지 않는 두 개의 원래 행(09:49:0010:18:00 값이 있는 행)을 제거합니다.