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

169 lines
2.9 KiB
SQL

# name: test/sql/aggregate/aggregates/test_median.test
# description: Test MEDIAN aggregate
# group: [aggregates]
statement ok
PRAGMA enable_verification
statement ok
PRAGMA verify_external
# scalar quantiles
query II
SELECT median(NULL), median(1)
----
NULL 1
query II
SELECT median(NULL), median(1) FROM range(2000)
----
NULL 1
statement ok
create table quantile as select range r, random() from range(10000) union all values (NULL, 0.1), (NULL, 0.5), (NULL, 0.9) order by 2;
query I
SELECT median(r)::VARCHAR FROM quantile
----
4999.5
query R
SELECT median(r::float)::VARCHAR FROM quantile
----
4999.5
query R
SELECT median(r::double)::VARCHAR FROM quantile
----
4999.5
query I
SELECT median(r::tinyint)::VARCHAR FROM quantile where r < 100
----
49.5
query I
SELECT median(r::smallint)::VARCHAR FROM quantile
----
4999.5
query I
SELECT median(r::integer)::VARCHAR FROM quantile
----
4999.5
query I
SELECT median(r::bigint)::VARCHAR FROM quantile
----
4999.5
query I
SELECT median(r::hugeint)::VARCHAR FROM quantile
----
4999.5
query I
SELECT median(r::decimal(10,2))::VARCHAR FROM quantile
----
4999.50
query I
SELECT median(case when r is null then null else [r] end)::VARCHAR FROM quantile
----
[4999]
query I
SELECT median(case when r is null then null else {'i': r} end)::VARCHAR FROM quantile
----
{'i': 4999}
# sorting order is different for varchars and numbers
# so a different result here is expected
query I
SELECT median(r::varchar) FROM quantile
----
5498
# adding a prefix
query I
SELECT median(case when r is null then null else concat('thishasalongprefix_', r::varchar) end) FROM quantile
----
thishasalongprefix_5498
query I
SELECT median(NULL) FROM quantile
----
NULL
query I
SELECT median(42) FROM quantile
----
42
#
# Validate even number of values for all types.
#
# Interpolated
foreach type <integral> DECIMAL(4,1) DECIMAL(9,1) DECIMAL(18,1) DECIMAL(38,1) float double
# We don't need to cast these values because
# they are too small for the 1% floating point margin to affect the result
query I
SELECT MEDIAN(range::${type})
FROM range(0,10);
----
4.5
endloop
foreach type date timestamp timestamp_s timestamp_ms timestamp_ns
query I
SELECT MEDIAN(range::${type})
FROM range('2024-01-01'::date, '2024-01-11'::date, INTERVAL 1 DAY);
----
2024-01-05 12:00:00
endloop
query I
SELECT MEDIAN(range::timestamptz)
FROM range('2024-01-01'::date, '2024-01-11'::date, INTERVAL 1 DAY);
----
2024-01-05 12:00:00+00
query I
SELECT MEDIAN('00:00:00'::TIME + INTERVAL (range) HOUR)
FROM range(0,10);
----
04:30:00
query I
SELECT MEDIAN(ttz::TIMETZ)
FROM (VALUES
('00:00:00-09'),
('00:00:00-08'),
('00:00:00-07'),
('00:00:00-06'),
('00:00:00-05'),
('00:00:00-04'),
('00:00:00-03'),
('00:00:00-02'),
('00:00:00-01'),
('00:00:00+00'),
) tbl(ttz);
----
00:00:00-04:30
# Floored
foreach type varchar
query I
SELECT MEDIAN(range::${type}) FROM range(0,10);
----
4
endloop