카테고리:

집계 함수 (General) , 윈도우 함수

MODE

expr1 내의 값에 대해 가장 빈번한 값을 반환합니다. NULL 값은 무시됩니다. 모든 값이 NULL이거나 행이 0이면 함수는 NULL을 반환합니다.

구문

집계 함수

MODE( <expr1> )
Copy

윈도우 함수

MODE( <expr1> ) OVER ( [ PARTITION BY <expr2> ] )
Copy

인자

expr1

이 식은 가장 빈번한 값을 찾기 위해 검색되는 값을 생성합니다. 식은 다음 데이터 타입 중 하나일 수 있습니다.

  • BINARY

  • BOOLEAN

  • DATE

  • FLOAT

  • INTEGER

  • NUMBER

  • TIMESTAMP (TIMESTAMP_LTZ, TIMESTAMP_NTZ, TIMESTAMP_TZ)

  • VARCHAR

  • VARIANT

이 함수는 다음 데이터 타입을 지원하지 않습니다.

  • ARRAY

  • GEOGRAPHY

  • OBJECT

expr2

데이터를 그룹으로 분할할 선택적 식입니다. 출력에는 각 그룹/파티션에 대한 가장 빈번한 값이 포함됩니다.

반환

반환된 값의 데이터 타입은 입력 식의 데이터 타입과 동일합니다.

사용법 노트

  • 가장 빈번한 값에 동점이 있는 경우(두 개 이상의 값이 서로 마찬가지로 자주 발생하고, 다른 어떤 값보다 더 자주 발생하는 경우), MODE는 해당 값 중 하나를 반환합니다.

  • 이 함수에는 DISTINCT가 지원되지 않습니다.

  • NULL이 가장 빈번한 값이더라도 함수는 NULL을 반환하지 않습니다(모든 값이 NULL인 경우가 아닌 한).

  • 이 함수가 윈도우 함수로 호출되는 경우에는 다음을 지원하지 않습니다.

    • OVER 절 내의 ORDER BY 절.

    • 명시적 윈도우 프레임.

다음 코드는 MODE 함수의 사용법을 보여줍니다.

테이블과 데이터를 만듭니다.

create or replace table aggr(k int, v decimal(10,2));
Copy

v 열에 대한 MODE 값을 가져옵니다. 행이 없기 때문에 함수는 NULL을 반환합니다.

select mode(v) from aggr;
+---------+
| MODE(V) |
|---------|
|    NULL |
+---------+
Copy

일부 행을 삽입합니다.

INSERT INTO aggr (k, v) VALUES
    (1, 10), 
    (1, 10), 
    (1, 10), 
    (1, 10), 
    (1, 20), 
    (1, 21);
Copy

MODE 함수는 가장 빈도가 높은 값 10 을 반환합니다.

select mode(v) from aggr;
+---------+
| MODE(V) |
|---------|
|   10.00 |
+---------+
Copy

행을 몇 개 더 삽입합니다.

INSERT INTO aggr (k, v) VALUES
    (2, 20), 
    (2, 20), 
    (2, 25), 
    (2, 30);
Copy

이제 가장 빈도가 높은 값이 2개 있습니다. MODE 함수는 값 10 을 선택합니다.

select mode(v) from aggr;
+---------+
| MODE(V) |
|---------|
|   10.00 |
+---------+
Copy

NULL 값이 있는 행을 삽입합니다.

INSERT INTO aggr (k, v) VALUES (3, null);
Copy

각 그룹의 MODE 값을 가져옵니다. 그룹 k = 3 에는 NULL 값만 포함되므로 해당 그룹에 대해 반환된 값은 NULL입니다.

select k, mode(v) 
    from aggr 
    group by k
    order by k;
+---+---------+
| K | MODE(V) |
|---+---------|
| 1 |   10.00 |
| 2 |   20.00 |
| 3 |    NULL |
+---+---------+
Copy

MODE 함수는 OVER 절과 함께 기본 윈도우 함수로 사용할 수도 있습니다.

select k, v, mode(v) over (partition by k) 
    from aggr 
    order by k, v;
+---+-------+-------------------------------+
| K |     V | MODE(V) OVER (PARTITION BY K) |
|---+-------+-------------------------------|
| 1 | 10.00 |                         10.00 |
| 1 | 10.00 |                         10.00 |
| 1 | 10.00 |                         10.00 |
| 1 | 10.00 |                         10.00 |
| 1 | 20.00 |                         10.00 |
| 1 | 21.00 |                         10.00 |
| 2 | 20.00 |                         20.00 |
| 2 | 20.00 |                         20.00 |
| 2 | 25.00 |                         20.00 |
| 2 | 30.00 |                         20.00 |
| 3 |  NULL |                          NULL |
+---+-------+-------------------------------+
Copy