Categories:

Aggregate Functions (General) , Window Functions (Window Frame)

# MODE¶

Returns the most frequent value for the values within expr1. NULL values are ignored. If all the values are NULL, or there are 0 rows, then the function returns NULL.

## Syntax¶

Aggregate function

MODE( <expr1> )


Window function

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


## Arguments¶

expr1

This expression produces the values that are searched to find the most frequent value. The expression can be of any of the following data types:

• BINARY

• BOOLEAN

• DATE

• FLOAT

• INTEGER

• NUMBER

• TIMESTAMP (TIMESTAMP_LTZ, TIMESTAMP_NTZ, TIMESTAMP_TZ)

• VARCHAR

• VARIANT

This function does not support the following data types:

• ARRAY

• GEOGRAPHY

• OBJECT

expr2

The optional expression on which to partition the data into groups. The output contains the most frequent value for each group/partition.

## Returns¶

The data type of the returned value is identical to the data type of the input expression.

## Usage Notes¶

• If there is a tie for most frequent value (two or more values occur as frequently as each other, and more frequently than any other value), MODE returns one of those values.

• DISTINCT is not supported for this function.

• Even if NULL is the most frequent value, the function does not return NULL (unless all values are NULL).

• When used as a window functions:

• This function does not support:

• ORDER BY sub-clause in the OVER() clause. The order of the values does not matter when choosing the most frequent value.

• Window frames.

## Examples¶

The following code demonstrates the use of MODE:

Create a table and data:

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


Get the MODE value for column v. The function returns NULL because there are no rows.

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


Insert some rows:

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


MODE returns the most frequent value 10:

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


Insert some more rows:

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


Now there are two most frequent values. MODE selects the value 10:

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


Insert a row with NULL value:

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


Get the MODE value for each group. Note that because the values in group k = 3 only contains NULL values, the returned value for that group is NULL.

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


MODE can also be used as a basic window function with an OVER() clause:

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 | 20.00 |                         10.00 |
| 1 | 21.00 |                         10.00 |
| 2 | 20.00 |                         20.00 |
| 2 | 25.00 |                         20.00 |
| 2 | 30.00 |                         20.00 |
| 3 |  NULL |                          NULL |
+---+-------+-------------------------------+