# name: test/sql/aggregate/aggregates/test_mode.test # description: Test mode function # group: [aggregates] statement ok SET default_null_order='nulls_first'; statement ok PRAGMA enable_verification statement ok PRAGMA verify_external #Corner cases statement error select mode() ---- query I select mode(NULL) ---- NULL query I select mode(1) ---- 1 statement error select mode(*) ---- statement ok create table aggr(k int, v decimal(10,2)); statement ok insert into aggr (k, v) values (1, 10), (1, 10), (1, 20), (1, 21); query I select mode(v) from aggr; ---- 10 query I SELECT mode(2) FROM range(100); ---- 2 statement ok insert into aggr (k, v) values (2, 20),(2, 20), (2, 25), (2, 30); query I SELECT CASE WHEN ( value = 10 or value = 20) THEN TRUE ELSE FALSE END FROM (select mode(v) as value from aggr) AS T ---- 1 statement ok insert into aggr (k, v) values (3, null); query II select k, mode(v) from aggr group by k order by k; ---- 1 10.000000 2 20.000000 3 NULL statement ok create table names (name string) statement ok insert into names values ('pedro'), ('pedro'), ('pedro'),('hannes'),('hannes'),('mark'),(null); query I select mode(name) from names; ---- pedro query III select k, v, mode(v) over (partition by k) from aggr order by k, v; ---- 1 10.00 10.000000 1 10.00 10.000000 1 20.00 10.000000 1 21.00 10.000000 2 20.00 20.000000 2 20.00 20.000000 2 25.00 20.000000 2 30.00 20.000000 3 NULL NULL # Empty Table query I SELECT mode(i) FROM range(100) tbl(i) WHERE 1=0; ---- NULL # Temporal types statement ok create table dates (k int, v date) statement ok insert into dates values (1, '2021-05-02'), (1, '2021-05-02'), (2, '2021-05-02'), (2, '2020-02-29'), (2, '2020-02-29'), (3, '2004-09-01'), (1, null); query I select mode(v) from dates; ---- 2021-05-02 query II select k, mode(v) from dates group by k ORDER BY ALL; ---- 1 2021-05-02 2 2020-02-29 3 2004-09-01 query III select k, v, mode(v) over (partition by k) from dates order by k, v; ---- 1 NULL 2021-05-02 1 2021-05-02 2021-05-02 1 2021-05-02 2021-05-02 2 2020-02-29 2020-02-29 2 2020-02-29 2020-02-29 2 2021-05-02 2020-02-29 3 2004-09-01 2004-09-01 statement ok create table times (k int, v time) statement ok insert into times values (1, '12:11:49.5'), (1, '12:11:49.5'), (2, '12:11:49.5'), (2, '06:30:00'), (2, '06:30:00'), (3, '21:15:22'), (1, null); query I select mode(v) from times; ---- 12:11:49.5 query II select k, mode(v) from times group by k ORDER BY ALL; ---- 1 12:11:49.5 2 06:30:00 3 21:15:22 query III select k, v, mode(v) over (partition by k) from times order by k, v; ---- 1 NULL 12:11:49.5 1 12:11:49.5 12:11:49.5 1 12:11:49.5 12:11:49.5 2 06:30:00 06:30:00 2 06:30:00 06:30:00 2 12:11:49.5 06:30:00 3 21:15:22 21:15:22 statement ok create table timestamps (k int, v timestamp) statement ok insert into timestamps values (1, '2021-05-02 12:11:49.5'), (1, '2021-05-02 12:11:49.5'), (2, '2021-05-02 12:11:49.5'), (2,'2020-02-29 06:30:00'), (2,'2020-02-29 06:30:00'), (3,'2004-09-01 21:15:22'), (1, null); query I select mode(v) from timestamps; ---- 2021-05-02 12:11:49.5 query II select k, mode(v) from timestamps group by k ORDER BY ALL; ---- 1 2021-05-02 12:11:49.5 2 2020-02-29 06:30:00 3 2004-09-01 21:15:22 query III select k, v, mode(v) over (partition by k) from timestamps order by k, v; ---- 1 NULL 2021-05-02 12:11:49.5 1 2021-05-02 12:11:49.5 2021-05-02 12:11:49.5 1 2021-05-02 12:11:49.5 2021-05-02 12:11:49.5 2 2020-02-29 06:30:00 2020-02-29 06:30:00 2 2020-02-29 06:30:00 2020-02-29 06:30:00 2 2021-05-02 12:11:49.5 2020-02-29 06:30:00 3 2004-09-01 21:15:22 2004-09-01 21:15:22 statement ok create table intervals (k int, v interval) statement ok insert into intervals values (1, INTERVAL '5 months 2 days 12 hours 11 minutes 49 seconds'), (1, INTERVAL '5 months 2 days 12 hours 11 minutes 49 seconds'), (2, INTERVAL '5 months 2 days 12 hours 11 minutes 49 seconds'), (2, INTERVAL '2 months 29 days 6 hours 30 minutes'), (2, INTERVAL '2 months 29 days 6 hours 30 minutes'), (3, INTERVAL '9 months 1 day 21 hours 15 minutes 22 seconds'), (1, null); query I select mode(v) from intervals; ---- 5 months 2 days 12:11:49 query II select k, mode(v) from intervals group by k ORDER BY ALL; ---- 1 5 months 2 days 12:11:49 2 2 months 29 days 06:30:00 3 9 months 1 day 21:15:22 query III select k, v, mode(v) over (partition by k) from intervals order by k, v; ---- 1 NULL 5 months 2 days 12:11:49 1 5 months 2 days 12:11:49 5 months 2 days 12:11:49 1 5 months 2 days 12:11:49 5 months 2 days 12:11:49 2 2 months 29 days 06:30:00 2 months 29 days 06:30:00 2 2 months 29 days 06:30:00 2 months 29 days 06:30:00 2 5 months 2 days 12:11:49 2 months 29 days 06:30:00 3 9 months 1 day 21:15:22 9 months 1 day 21:15:22 # Huge integers statement ok create table hugeints (k int, v hugeint) statement ok insert into hugeints values (1, 5), (1, 5), (2, 5), (2, 2), (2, 2), (3, 1), (1, null); query I select mode(v) from hugeints; ---- 5 query II select k, mode(v) from hugeints group by k ORDER BY ALL; ---- 1 5 2 2 3 1 query III select k, v, mode(v) over (partition by k) from hugeints order by k, v; ---- 1 NULL 5 1 5 5 1 5 5 2 2 2 2 2 2 2 5 2 3 1 1 # MODE is order-sensitive, so this should bind and return the larger value query I SELECT MODE(order_occurrences ORDER BY order_occurrences DESC) FROM ( VALUES (500, 1), (1000, 2), (800, 3), (1000, 4), (500, 5), (550, 6), (400, 7), (200, 8), (10, 9) )items_per_order(order_occurrences, item_count); ---- 1000