Files
email-tracker/external/duckdb/test/sql/aggregate/aggregates/test_mode.test
2025-10-24 19:21:19 -05:00

309 lines
5.6 KiB
SQL

# 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