diff --git a/datafusion/core/tests/dataframe/describe.rs b/datafusion/core/tests/dataframe/describe.rs index c61fe4fed1615..9aa8a49c97ae3 100644 --- a/datafusion/core/tests/dataframe/describe.rs +++ b/datafusion/core/tests/dataframe/describe.rs @@ -44,7 +44,7 @@ async fn describe() -> Result<()> { | std | 2107.472815166704 | null | 2.8724780750809518 | 2.8724780750809518 | 2.8724780750809518 | 28.724780750809533 | 3.1597258182544645 | 29.012028558317645 | null | null | null | 0.5000342500942125 | 3.44808750051728 | | min | 0.0 | null | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 01/01/09 | 0 | 2008-12-31T23:00:00 | 2009.0 | 1.0 | | max | 7299.0 | null | 9.0 | 9.0 | 9.0 | 90.0 | 9.899999618530273 | 90.89999999999999 | 12/31/10 | 9 | 2010-12-31T04:09:13.860 | 2010.0 | 12.0 | - | median | 3649.0 | null | 4.0 | 4.0 | 4.0 | 45.0 | 4.949999809265137 | 45.45 | null | null | null | 2009.0 | 7.0 | + | median | 3649.5 | null | 4.5 | 4.5 | 4.5 | 45.0 | 4.949999809265137 | 45.45 | null | null | null | 2009.5 | 7.0 | +------------+-------------------+----------+--------------------+--------------------+--------------------+--------------------+--------------------+--------------------+-----------------+------------+-------------------------+--------------------+-------------------+ "); Ok(()) diff --git a/datafusion/core/tests/dataframe/mod.rs b/datafusion/core/tests/dataframe/mod.rs index e0830754399db..1418dcad1150e 100644 --- a/datafusion/core/tests/dataframe/mod.rs +++ b/datafusion/core/tests/dataframe/mod.rs @@ -1204,26 +1204,26 @@ async fn window_using_aggregates() -> Result<()> { | first_value | last_val | approx_distinct | approx_median | median | max | min | c2 | c3 | +-------------+----------+-----------------+---------------+--------+-----+------+----+------+ | | | | | | | | 1 | -85 | - | -85 | -101 | 14 | -12.0 | -12 | 83 | -101 | 4 | -54 | - | -85 | -101 | 17 | -25.0 | -25 | 83 | -101 | 5 | -31 | - | -85 | -12 | 10 | -32.75 | -34 | 83 | -85 | 3 | 13 | - | -85 | -25 | 3 | -56.0 | -56 | -25 | -85 | 1 | -5 | - | -85 | -31 | 18 | -29.75 | -28 | 83 | -101 | 5 | 36 | - | -85 | -38 | 16 | -25.0 | -25 | 83 | -101 | 4 | 65 | - | -85 | -43 | 7 | -43.0 | -43 | 83 | -85 | 2 | 45 | - | -85 | -48 | 6 | -35.75 | -36 | 83 | -85 | 2 | -43 | - | -85 | -5 | 4 | -37.75 | -40 | -5 | -85 | 1 | 83 | - | -85 | -54 | 15 | -17.0 | -18 | 83 | -101 | 4 | -38 | - | -85 | -56 | 2 | -70.5 | -70 | -56 | -85 | 1 | -25 | - | -85 | -72 | 9 | -43.0 | -43 | 83 | -85 | 3 | -12 | - | -85 | -85 | 1 | -85.0 | -85 | -85 | -85 | 1 | -56 | - | -85 | 13 | 11 | -17.0 | -18 | 83 | -85 | 3 | 14 | - | -85 | 13 | 11 | -25.0 | -25 | 83 | -85 | 3 | 13 | - | -85 | 14 | 12 | -12.0 | -12 | 83 | -85 | 3 | 17 | - | -85 | 17 | 13 | -11.25 | -8 | 83 | -85 | 4 | -101 | - | -85 | 45 | 8 | -34.5 | -34 | 83 | -85 | 3 | -72 | - | -85 | 65 | 17 | -17.0 | -18 | 83 | -101 | 5 | -101 | - | -85 | 83 | 5 | -25.0 | -25 | 83 | -85 | 2 | -48 | + | -85 | -101 | 14 | -12.0 | -12.0 | 83 | -101 | 4 | -54 | + | -85 | -101 | 17 | -25.0 | -25.0 | 83 | -101 | 5 | -31 | + | -85 | -12 | 10 | -32.75 | -34.0 | 83 | -85 | 3 | 13 | + | -85 | -25 | 3 | -56.0 | -56.0 | -25 | -85 | 1 | -5 | + | -85 | -31 | 18 | -29.75 | -28.0 | 83 | -101 | 5 | 36 | + | -85 | -38 | 16 | -25.0 | -25.0 | 83 | -101 | 4 | 65 | + | -85 | -43 | 7 | -43.0 | -43.0 | 83 | -85 | 2 | 45 | + | -85 | -48 | 6 | -35.75 | -36.5 | 83 | -85 | 2 | -43 | + | -85 | -5 | 4 | -37.75 | -40.5 | -5 | -85 | 1 | 83 | + | -85 | -54 | 15 | -17.0 | -18.5 | 83 | -101 | 4 | -38 | + | -85 | -56 | 2 | -70.5 | -70.5 | -56 | -85 | 1 | -25 | + | -85 | -72 | 9 | -43.0 | -43.0 | 83 | -85 | 3 | -12 | + | -85 | -85 | 1 | -85.0 | -85.0 | -85 | -85 | 1 | -56 | + | -85 | 13 | 11 | -17.0 | -18.5 | 83 | -85 | 3 | 14 | + | -85 | 13 | 11 | -25.0 | -25.0 | 83 | -85 | 3 | 13 | + | -85 | 14 | 12 | -12.0 | -12.0 | 83 | -85 | 3 | 17 | + | -85 | 17 | 13 | -11.25 | -8.5 | 83 | -85 | 4 | -101 | + | -85 | 45 | 8 | -34.5 | -34.0 | 83 | -85 | 3 | -72 | + | -85 | 65 | 17 | -17.0 | -18.5 | 83 | -101 | 5 | -101 | + | -85 | 83 | 5 | -25.0 | -25.0 | 83 | -85 | 2 | -48 | +-------------+----------+-----------------+---------------+--------+-----+------+----+------+ " ); diff --git a/datafusion/core/tests/sql/aggregates/dict_nulls.rs b/datafusion/core/tests/sql/aggregates/dict_nulls.rs index f9e15a71a20f8..8733b9e87b57a 100644 --- a/datafusion/core/tests/sql/aggregates/dict_nulls.rs +++ b/datafusion/core/tests/sql/aggregates/dict_nulls.rs @@ -91,10 +91,10 @@ async fn test_aggregates_null_handling_comprehensive() -> Result<()> { +----------------+--------------+ | dict_null_vals | median_value | +----------------+--------------+ - | | 3 | - | group_x | 1 | - | group_y | 5 | - | group_z | 7 | + | | 3.0 | + | group_x | 1.0 | + | group_y | 5.0 | + | group_z | 7.0 | +----------------+--------------+ "); @@ -437,16 +437,16 @@ async fn test_median_distinct_with_fuzz_table_dict_nulls() -> Result<()> { assert_snapshot!( batches_to_string(&results), @r" - +--------+---------------------+------+------+------+--------+--------+ - | u8_low | dictionary_utf8_low | col1 | col2 | col3 | col4 | col5 | - +--------+---------------------+------+------+------+--------+--------+ - | 50 | | | 30 | | 987.65 | 400000 | - | 50 | group_three | 5000 | 50 | 5000 | 555.55 | 500000 | - | 75 | | 4000 | | 4000 | | 450000 | - | 100 | group_one | 1100 | 11 | 1000 | 123.45 | 110000 | - | 100 | group_two | 1500 | 15 | 1500 | 111.11 | 150000 | - | 200 | | 2500 | 22 | 2500 | 506.11 | 250000 | - +--------+---------------------+------+------+------+--------+--------+ + +--------+---------------------+--------+------+--------+--------+----------+ + | u8_low | dictionary_utf8_low | col1 | col2 | col3 | col4 | col5 | + +--------+---------------------+--------+------+--------+--------+----------+ + | 50 | | | 30.0 | | 987.65 | 400000.0 | + | 50 | group_three | 5000.0 | 50.0 | 5000.0 | 555.55 | 500000.0 | + | 75 | | 4000.0 | | 4000.0 | | 450000.0 | + | 100 | group_one | 1100.0 | 11.0 | 1000.0 | 123.45 | 110000.0 | + | 100 | group_two | 1500.0 | 15.0 | 1500.0 | 111.11 | 150000.0 | + | 200 | | 2500.0 | 22.5 | 2500.0 | 506.11 | 250000.0 | + +--------+---------------------+--------+------+--------+--------+----------+ " ); diff --git a/datafusion/functions-aggregate/src/median.rs b/datafusion/functions-aggregate/src/median.rs index 74473e2f2884f..02a49ab6dcca0 100644 --- a/datafusion/functions-aggregate/src/median.rs +++ b/datafusion/functions-aggregate/src/median.rs @@ -39,14 +39,15 @@ use arrow::datatypes::{ ArrowNativeType, ArrowPrimitiveType, Decimal32Type, Decimal64Type, FieldRef, }; +use datafusion_common::types::{NativeType, logical_float64}; use datafusion_common::{ DataFusionError, Result, ScalarValue, assert_eq_or_internal_err, internal_datafusion_err, }; use datafusion_expr::function::StateFieldsArgs; use datafusion_expr::{ - Accumulator, AggregateUDFImpl, Documentation, Signature, Volatility, - function::AccumulatorArgs, utils::format_state_name, + Accumulator, AggregateUDFImpl, Coercion, Documentation, Signature, TypeSignature, + TypeSignatureClass, Volatility, function::AccumulatorArgs, utils::format_state_name, }; use datafusion_expr::{EmitTo, GroupsAccumulator}; use datafusion_functions_aggregate_common::aggregate::groups_accumulator::accumulate::accumulate; @@ -99,7 +100,25 @@ impl Default for Median { impl Median { pub fn new() -> Self { Self { - signature: Signature::numeric(1, Volatility::Immutable), + // Integer inputs are coerced to Float64 so the average of the two + // middle values is not truncated. This matches DuckDB / PostgreSQL / Spark. + // Float and Decimal inputs preserve their type. + signature: Signature::one_of( + vec![ + TypeSignature::Coercible(vec![Coercion::new_exact( + TypeSignatureClass::Decimal, + )]), + TypeSignature::Coercible(vec![Coercion::new_exact( + TypeSignatureClass::Float, + )]), + TypeSignature::Coercible(vec![Coercion::new_implicit( + TypeSignatureClass::Native(logical_float64()), + vec![TypeSignatureClass::Integer], + NativeType::Float64, + )]), + ], + Volatility::Immutable, + ), } } } diff --git a/datafusion/sqllogictest/test_files/aggregate.slt b/datafusion/sqllogictest/test_files/aggregate.slt index 00ca0482a31e1..70acff3cb7b9a 100644 --- a/datafusion/sqllogictest/test_files/aggregate.slt +++ b/datafusion/sqllogictest/test_files/aggregate.slt @@ -965,16 +965,16 @@ statement error SELECT approx_median(c1) FROM aggregate_test_100 # csv_query_median_1 -query I +query R SELECT median(c2) FROM aggregate_test_100 ---- 3 # csv_query_median_2 -query I +query R SELECT median(c6) FROM aggregate_test_100 ---- -1125553990140691277 +1125553990140691200 # csv_query_median_3 query R @@ -983,18 +983,18 @@ SELECT median(c12) FROM aggregate_test_100 0.551390054439 # median_i8 -query I +query R SELECT median(col_i8) FROM median_table ---- -14 # distinct_median_i8 -query I +query R SELECT median(distinct col_i8) FROM median_table ---- 100 -query II +query RR SELECT median(col_i8), median(distinct col_i8) FROM median_table ---- -14 100 @@ -1016,43 +1016,43 @@ query error DataFusion error: Error during planning: \[IGNORE \| RESPECT\] NULLS SELECT median(c2) RESPECT NULLS FROM aggregate_test_100 # median_i16 -query I +query R SELECT median(col_i16) FROM median_table ---- -16334 # median_i32 -query I +query R SELECT median(col_i32) FROM median_table ---- -1073741774 # median_i64 -query I +query R SELECT median(col_i64) FROM median_table ---- --4611686018427387854 +-4611686018427388000 # median_u8 -query I +query R SELECT median(col_u8) FROM median_table ---- 50 # median_u16 -query I +query R SELECT median(col_u16) FROM median_table ---- 50 # median_u32 -query I +query R SELECT median(col_u32) FROM median_table ---- 50 # median_u64 -query I +query R SELECT median(col_u64) FROM median_table ---- 50 @@ -1083,56 +1083,56 @@ NaN # median_i8_overflow_negative -query I +query R SELECT median(v) FROM (VALUES (arrow_cast(-85, 'Int8')), (arrow_cast(-56, 'Int8'))) AS t(v); ---- --70 +-70.5 # median_i8_overflow_positive # Test overflow with positive values: 100 + 120 = 220 > 127 (max i8) -query I +query R SELECT median(v) FROM (VALUES (arrow_cast(100, 'Int8')), (arrow_cast(120, 'Int8'))) AS t(v); ---- 110 # median_u8_overflow # Test unsigned overflow: 200 + 250 = 450 > 255 (max u8) -query I +query R SELECT median(v) FROM (VALUES (arrow_cast(200, 'UInt8')), (arrow_cast(250, 'UInt8'))) AS t(v); ---- 225 # median_i8_no_overflow_normal_case # Normal case that doesn't overflow for comparison -query I +query R SELECT median(v) FROM (VALUES (arrow_cast(4, 'Int8')), (arrow_cast(5, 'Int8'))) AS t(v); ---- -4 +4.5 # median_i8_max_values # Test with both i8::MAX values: 127 + 127 = 254 > 127, overflow -query I +query R SELECT median(v) FROM (VALUES (arrow_cast(127, 'Int8')), (arrow_cast(127, 'Int8'))) AS t(v); ---- 127 # median_i8_min_values # Test with both i8::MIN values: -128 + -128 = -256 < -128, underflow -query I +query R SELECT median(v) FROM (VALUES (arrow_cast(-128, 'Int8')), (arrow_cast(-128, 'Int8'))) AS t(v); ---- -128 # median_i8_min_max_values # Test with i8::MIN and i8::MAX: -128 + 127 = -1, no overflow, median = 0 (truncated from -0.5) -query I +query R SELECT median(v) FROM (VALUES (arrow_cast(-128, 'Int8')), (arrow_cast(127, 'Int8'))) AS t(v); ---- -0 +-0.5 # median_u8_max_values # Test with both u8::MAX values: 255 + 255 = 510 > 255, overflow -query I +query R SELECT median(v) FROM (VALUES (arrow_cast(255, 'UInt8')), (arrow_cast(255, 'UInt8'))) AS t(v); ---- 255 @@ -1431,7 +1431,7 @@ drop table t; statement ok create table t(c int) as values (1), (2), (3), (4), (5); -query I +query R select median(c) from t; ---- 3 @@ -1443,10 +1443,10 @@ drop table t; statement ok create table t(c int) as values (1), (2), (3), (4), (5), (6); -query I +query R select median(c) from t; ---- -3 +3.5 statement ok drop table t; @@ -1455,10 +1455,10 @@ drop table t; statement ok create table t(c int) as values (1), (null), (3), (4), (5); -query I +query R select median(c) from t; ---- -3 +3.5 statement ok drop table t; @@ -1467,7 +1467,7 @@ drop table t; statement ok create table t(c int) as values (null), (null), (null); -query I +query R select median(c) from t; ---- NULL @@ -1479,7 +1479,7 @@ drop table t; statement ok create table t(c int unsigned) as values (1), (2), (3), (4), (5); -query I +query R select median(c) from t; ---- 3 @@ -1527,7 +1527,7 @@ drop table t; statement ok create table t(c int) as values (2), (1), (1), (2), (1), (3); -query I +query R select median(distinct c) from t; ---- 2 @@ -1539,7 +1539,7 @@ drop table t; statement ok create table t(c int) as values (1), (1), (3), (1), (1); -query I +query R select median(distinct c) from t; ---- 2 @@ -1551,7 +1551,7 @@ drop table t; statement ok create table t(c int) as values (1), (null), (1), (1), (3); -query I +query R select median(distinct c) from t; ---- 2 @@ -1563,7 +1563,7 @@ drop table t; statement ok create table t(c int unsigned) as values (1), (1), (2), (1), (3); -query I +query R select median(distinct c) from t; ---- 2 @@ -1575,7 +1575,7 @@ drop table t; statement ok create table t(c int unsigned) as values (1), (1), (1), (1), (3), (3); -query I +query R select median(distinct c) from t; ---- 2 @@ -1635,7 +1635,7 @@ drop table t; statement ok create table t(c int) as values (1), (1), (1), (1), (2), (2), (3), (3); -query I +query R select median(distinct c) from t; ---- 2 @@ -1653,7 +1653,7 @@ explain select median(distinct c) from t; logical_plan 01)Projection: median(alias1) AS median(DISTINCT t.c) 02)--Aggregate: groupBy=[[]], aggr=[[median(alias1)]] -03)----Aggregate: groupBy=[[t.c AS alias1]], aggr=[[]] +03)----Aggregate: groupBy=[[CAST(t.c AS Float64) AS alias1]], aggr=[[]] 04)------TableScan: t projection=[c] physical_plan 01)ProjectionExec: expr=[median(alias1)@0 as median(DISTINCT t.c)] @@ -1662,7 +1662,7 @@ physical_plan 04)------AggregateExec: mode=Partial, gby=[], aggr=[median(alias1)] 05)--------AggregateExec: mode=FinalPartitioned, gby=[alias1@0 as alias1], aggr=[] 06)----------RepartitionExec: partitioning=Hash([alias1@0], 4), input_partitions=1 -07)------------AggregateExec: mode=Partial, gby=[c@0 as alias1], aggr=[] +07)------------AggregateExec: mode=Partial, gby=[CAST(c@0 AS Float64) as alias1], aggr=[] 08)--------------DataSourceExec: partitions=1, partition_sizes=[1] statement ok @@ -3959,7 +3959,7 @@ SELECT percentile_cont(0.75) WITHIN GROUP (ORDER BY c2) FROM aggregate_test_100 4 # Test that percentile_cont(0.5) equals median -query I +query R SELECT median(c2) FROM aggregate_test_100 ---- 3 @@ -5979,7 +5979,7 @@ statement ok drop table t; -query I +query R select median(a) from (select 1 as a where 1=0); ---- NULL @@ -8095,56 +8095,56 @@ drop table t; ####### # group median i8 non-nullable -query TI rowsort +query TR rowsort SELECT col_group, median(col_i8) FROM group_median_table_non_nullable GROUP BY col_group ---- group0 -14 group1 100 # group median i16 non-nullable -query TI rowsort +query TR rowsort SELECT col_group, median(col_i16) FROM group_median_table_non_nullable GROUP BY col_group ---- group0 -16334 group1 100 # group median i32 non-nullable -query TI rowsort +query TR rowsort SELECT col_group, median(col_i32) FROM group_median_table_non_nullable GROUP BY col_group ---- group0 -1073741774 group1 100 # group median i64 non-nullable -query TI rowsort +query TR rowsort SELECT col_group, median(col_i64) FROM group_median_table_non_nullable GROUP BY col_group ---- -group0 -4611686018427387854 +group0 -4611686018427388000 group1 100 # group median u8 non-nullable -query TI rowsort +query TR rowsort SELECT col_group, median(col_u8) FROM group_median_table_non_nullable GROUP BY col_group ---- group0 50 group1 100 # group median u16 non-nullable -query TI rowsort +query TR rowsort SELECT col_group, median(col_u16) FROM group_median_table_non_nullable GROUP BY col_group ---- group0 50 group1 100 # group median u32 non-nullable -query TI rowsort +query TR rowsort SELECT col_group, median(col_u32) FROM group_median_table_non_nullable GROUP BY col_group ---- group0 50 group1 100 # group median u64 non-nullable -query TI rowsort +query TR rowsort SELECT col_group, median(col_u64) FROM group_median_table_non_nullable GROUP BY col_group ---- group0 50 @@ -8186,56 +8186,56 @@ group0 0.0002 group1 0.0003 # group median i8 nullable -query TI rowsort +query TR rowsort SELECT col_group, median(col_i8) FROM group_median_table_nullable GROUP BY col_group ---- group0 -14 group1 100 # group median i16 nullable -query TI rowsort +query TR rowsort SELECT col_group, median(col_i16) FROM group_median_table_nullable GROUP BY col_group ---- group0 -16334 group1 100 # group median i32 nullable -query TI rowsort +query TR rowsort SELECT col_group, median(col_i32) FROM group_median_table_nullable GROUP BY col_group ---- group0 -1073741774 group1 100 # group median i64 nullable -query TI rowsort +query TR rowsort SELECT col_group, median(col_i64) FROM group_median_table_nullable GROUP BY col_group ---- -group0 -4611686018427387854 +group0 -4611686018427388000 group1 100 # group median u8 nullable -query TI rowsort +query TR rowsort SELECT col_group, median(col_u8) FROM group_median_table_nullable GROUP BY col_group ---- group0 50 group1 100 # group median u16 nullable -query TI rowsort +query TR rowsort SELECT col_group, median(col_u16) FROM group_median_table_nullable GROUP BY col_group ---- group0 50 group1 100 # group median u32 nullable -query TI rowsort +query TR rowsort SELECT col_group, median(col_u32) FROM group_median_table_nullable GROUP BY col_group ---- group0 50 group1 100 # group median u64 nullable -query TI rowsort +query TR rowsort SELECT col_group, median(col_u64) FROM group_median_table_nullable GROUP BY col_group ---- group0 50 @@ -8289,11 +8289,11 @@ create table group_median_all_nulls( ( 'group1', NULL), ( 'group1', NULL) -query TIT rowsort +query TRT rowsort SELECT a, median(b), arrow_typeof(median(b)) FROM group_median_all_nulls GROUP BY a ---- -group0 NULL Int32 -group1 NULL Int32 +group0 NULL Float64 +group1 NULL Float64 statement ok create table t_decimal (c decimal(10, 4)) as values (100.00), (125.00), (175.00), (200.00), (200.00), (300.00), (null), (null); diff --git a/datafusion/sqllogictest/test_files/aggregate_skip_partial.slt b/datafusion/sqllogictest/test_files/aggregate_skip_partial.slt index cd95426a9b0bb..a10417f232409 100644 --- a/datafusion/sqllogictest/test_files/aggregate_skip_partial.slt +++ b/datafusion/sqllogictest/test_files/aggregate_skip_partial.slt @@ -130,7 +130,7 @@ GROUP BY 1, 2 ORDER BY 1 LIMIT 5; -2117946883 d -2117946883 NULL NULL NULL -2098805236 c -2098805236 NULL NULL NULL -query ITIIII +query ITRRRR SELECT c5, c1, MEDIAN(c5), MEDIAN(CASE WHEN c1 = 'a' THEN c5 ELSE NULL END), @@ -308,7 +308,7 @@ SELECT c2, sum(c5), sum(c11) FROM aggregate_test_100 GROUP BY c2 ORDER BY c2; 5 6449337880 7.074412226677 # Test median for int / float -query IIR +query IRR SELECT c2, median(c5), median(c11) FROM aggregate_test_100 GROUP BY c2 ORDER BY c2; ---- 1 23971150 0.5922606 @@ -389,14 +389,14 @@ SELECT c2, sum(c3), sum(c11) FROM aggregate_test_100 GROUP BY c2 ORDER BY c2; 5 -194 7.074412226677 # Test median with nullable fields -query IIR +query IRR SELECT c2, median(c3), median(c11) FROM aggregate_test_100_null GROUP BY c2 ORDER BY c2; ---- 1 12 0.6067944 2 1 0.46076488 3 14 0.40154034 -4 -17 0.48515016 -5 -35 0.5536642 +4 -17.5 0.48515016 +5 -35.5 0.5536642 # Test approx_median with nullable fields query IRR @@ -502,7 +502,7 @@ FROM aggregate_test_100 GROUP BY c2 ORDER BY c2; 5 5 0 # Test median with filter -query III +query IRR SELECT c2, median(c3) FILTER (WHERE c3 > 0), @@ -637,7 +637,7 @@ FROM aggregate_test_100_null GROUP BY c2 ORDER BY c2; 5 6 # Test median with nullable fields and filter -query IIR +query IRR SELECT c2, median(c3) FILTER (WHERE c5 > 0), median(c11) FILTER (WHERE c5 < 0) @@ -645,21 +645,21 @@ FROM aggregate_test_100_null GROUP BY c2 ORDER BY c2; ---- 1 -5 0.6623719 2 15 0.52930677 -3 13 0.32792538 +3 13.5 0.32792538 4 -38 0.49774808 5 -18 0.49842384 # Test min / max with nullable fields and nullable filter -query II +query IR SELECT c2, median(c3) FILTER (WHERE c11 > 0.5) FROM aggregate_test_100_null GROUP BY c2 ORDER BY c2; ---- -1 33 +1 33.5 2 -29 3 22 4 -90 -5 -22 +5 -22.5 # Test approx_median with nullable fields and filter query IRR diff --git a/datafusion/sqllogictest/test_files/clickbench_extended.slt b/datafusion/sqllogictest/test_files/clickbench_extended.slt index 6b0d78cdba8f3..c410c98fe8d74 100644 --- a/datafusion/sqllogictest/test_files/clickbench_extended.slt +++ b/datafusion/sqllogictest/test_files/clickbench_extended.slt @@ -48,7 +48,7 @@ SELECT "SocialSourceNetworkID", "RegionID", COUNT(*), AVG("Age"), AVG("ParamPric 0 839 6 0 0 0 0 0 197 2 0 0 0 0 -query IIIIII +query IIIIRI SELECT "ClientIP", "WatchID", COUNT(*) c, MIN("ResponseStartTiming") tmin, MEDIAN("ResponseStartTiming") tmed, MAX("ResponseStartTiming") tmax FROM hits WHERE "JavaEnable" = 0 GROUP BY "ClientIP", "WatchID" HAVING c > 1 ORDER BY tmed DESC LIMIT 10; ----