MAX

MAX (최댓값)

expr 안의 레코드에 대한 최댓값을 반환해요. 모든 레코드가 NULL이 아니면 NULL 값은 무시되며, 모든 레코드가 NULL이면 NULL 값이 반환돼요.

출처: Snowflake SQL Reference - MAX

본문

구문

집계 함수:

MAX( <expr> )

윈도우 함수:

MAX( <expr> ) [ OVER ( [ PARTITION BY <expr1> ] [ ORDER BY <expr2> [ { ASC | DESC } ] [ NULLS { FIRST | LAST } ] [ <window_frame> ] ] ) ]

자세한 window_frame 구문은 윈도우 함수 구문 및 사용법을 참고해요.

반환 값

반환 값의 데이터 타입은 입력 값의 데이터 타입과 같아요.

사용 참고 사항

  • 다른 시스템과의 호환성을 위해 함수의 인자로 DISTINCT 키워드를 지정할 수 있지만 효과가 없어요.
  • 함수가 윈도우 함수로 호출되면 윈도우에 선택적 window_frame이 포함될 수 있어요. window_frame(누적 또는 이동)은 합계 값을 반환할 윈도우 안의 행 부분집합을 지정해요. window_frame을 지정하지 않으면 기본값은 다음의 누적 윈도우 프레임이에요(윈도우 함수에 대한 ANSI 표준에 따름): RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW. 윈도우 프레임에 대한 구문과 예시를 포함한 자세한 내용은 윈도우 프레임 사용 참고 사항을 참고해요.

데이터 정렬(collation) 상세

  • 비교는 입력 인자들의 데이터 정렬과 우선 순위를 기반으로 하는 데이터 정렬을 따르요.
  • 결과의 데이터 정렬은 입력의 데이터 정렬과 같아요.

예시

다음 예시는 MAX 함수를 사용하는 방법을 보여줘요. 테이블과 데이터를 만들어요:

CREATE OR REPLACE TABLE sample_table (k CHAR(4), d CHAR(4));

INSERT INTO sample_table VALUES
  ('1', '1'), ('1', '5'), ('1', '3'),
  ('2', '2'), ('2', NULL),
  ('3', NULL),
  (NULL, '7'), (NULL, '1');

데이터를 표시해요:

SELECT k, d
  FROM sample_table
  ORDER BY k, d;
+------+------+
| K    | D    |
|------+------|
| 1    | 1    |
| 1    | 3    |
| 1    | 5    |
| 2    | 2    |
| 2    | NULL |
| 3    | NULL |
| NULL | 1    |
| NULL | 7    |
+------+------+

MAX 함수를 사용해 d라는 컬럼에서 가장 큰 값을 가져와요:

SELECT MAX(d)
  FROM sample_table;
+--------+
| MAX(D) |
|--------|
| 7      |
+--------+

GROUP BY 절과 MAX 함수를 결합해 각 그룹(각 그룹은 컬럼 k의 값을 기준으로 함)에서 가장 큰 값을 가져와요:

SELECT k, MAX(d)
  FROM sample_table
  GROUP BY k
  ORDER BY k;
+------+--------+
| K    | MAX(D) |
|------+--------|
| 1    | 5      |
| 2    | 2      |
| 3    | NULL   |
| NULL | 7      |
+------+--------+

PARTITION BY 절을 사용해 k 값을 기준으로 데이터를 그룹으로 나눠요. 이는 GROUP BY와 비슷하지만 동일하지 않아요. 특히 GROUP BY는 그룹당 출력 행 하나를 만들지만, PARTITION BY는 입력 행당 출력 행 하나를 만들어요.

SELECT k, d, MAX(d) OVER (PARTITION BY k)
  FROM sample_table
  ORDER BY k, d;
+------+------+------------------------------+
| K    | D    | MAX(D) OVER (PARTITION BY K) |
|------+------+------------------------------|
| 1    | 1    | 5                            |
| 1    | 3    | 5                            |
| 1    | 5    | 5                            |
| 2    | 2    | 2                            |
| 2    | NULL | 2                            |
| 3    | NULL | NULL                         |
| NULL | 1    | 7                            |
| NULL | 7    | 7                            |
+------+------+------------------------------+

윈도잉 ORDER BY 절을 사용해 두 행 너비의 이동 윈도우를 만들고, 그 윈도우 안의 가장 높은 값을 출력해요. (윈도잉 절의 ORDER BY는 문 수준의 ORDER BY와 별개임을 기억해요.) 이 예시는 단일 파티션을 사용하므로 OVER() 절에 PARTITION BY 절이 없어요.

SELECT k, d, MAX(d) OVER (ORDER BY k, d ROWS BETWEEN 1 PRECEDING AND CURRENT ROW)
  FROM sample_table
  ORDER BY k, d;
+------+------+----------------------------------------------------------------------+
| K    | D    | MAX(D) OVER (ORDER BY K, D ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) |
|------+------+----------------------------------------------------------------------|
| 1    | 1    | 1                                                                    |
| 1    | 3    | 3                                                                    |
| 1    | 5    | 5                                                                    |
| 2    | 2    | 5                                                                    |
| 2    | NULL | 2                                                                    |
| 3    | NULL | NULL                                                                 |
| NULL | 1    | 1                                                                    |
| NULL | 7    | 7                                                                    |
+------+------+----------------------------------------------------------------------+

더 알아보기