Skip to content

Commit 43e4176

Browse files
committed
quantile support multiple levels
1 parent 1837cd8 commit 43e4176

File tree

3 files changed

+24
-7
lines changed

3 files changed

+24
-7
lines changed

docs/doc/15-sql-functions/10-aggregate-functions/aggregate-quantile.md

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,17 @@ NULL values are not counted.
1414

1515
```sql
1616
QUANTILE(level)(expression)
17+
18+
QUANTILE(level1, level2, ...)(expression)
1719
```
1820

1921
## Arguments
2022

21-
| Arguments | Description |
22-
| ----------- |------------------------------------------------------------------------------------------------------------------------------|
23-
| level | level of quantile. Constant floating-point number from 0 to 1. We recommend using a level value in the range of [0.01, 0.99] |
24-
| ----------- | ----------- |
25-
| expression | Any numerical expression |
23+
| Arguments | Description |
24+
|-------------|-----------------------------------------------------------------------------------------------------------------------------------------------|
25+
| level(s) | level(s) of quantile. Each level is constant floating-point number from 0 to 1. We recommend using a level value in the range of [0.01, 0.99] |
26+
| ----------- | ----------- |
27+
| expression | Any numerical expression |
2628

2729
## Return Type
2830

@@ -42,3 +44,12 @@ SELECT QUANTILE(0.6)(number) FROM numbers(10000);
4244
| 5999 |
4345
+-----------------------+
4446
```
47+
48+
```sql
49+
SELECT quantile(0, 0.5, 0.6, 1)(number) from numbers_mt(10000);
50+
+----------------------------------+
51+
| quantile(0, 0.5, 0.6, 1)(number) |
52+
+----------------------------------+
53+
| [0,4999,5999,9999] |
54+
+----------------------------------+
55+
```

src/query/functions/src/aggregates/aggregate_quantile_cont.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -143,11 +143,12 @@ where
143143
if idx < value_len {
144144
self.value.as_mut_slice().select_nth_unstable(idx);
145145
let value = self.value.get(idx).unwrap();
146-
builder.put_item(T::to_scalar_ref(value));
146+
builder.put_item(T::upcast_scalar(value.clone()).as_ref());
147147
} else {
148148
builder.push_default();
149149
}
150150
}
151+
builder.commit_row();
151152
} else {
152153
let builder = T::try_downcast_builder(builder).unwrap();
153154
let idx = ((value_len - 1) as f64 * levels[0]).floor() as usize;
@@ -310,7 +311,7 @@ where
310311
)));
311312
}
312313
vec![level]
313-
} else if params.len() == 0 {
314+
} else if params.is_empty() {
314315
vec![0.5f64]
315316
} else {
316317
let mut levels = Vec::with_capacity(params.len());

tests/sqllogictests/suites/query/02_function/02_0000_function_aggregate_mix

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,11 @@ SELECT quantile(1)(number) from numbers_mt(10000)
222222
----
223223
9999
224224

225+
query T
226+
SELECT quantile(0, 0.5, 0.6, 1)(number) from numbers_mt(10000);
227+
----
228+
[0,4999,5999,9999]
229+
225230
statement error 1010
226231
SELECT quantile(5)(number) from numbers_mt(10000)
227232

0 commit comments

Comments
 (0)