180 lines
2.7 KiB
SQL
180 lines
2.7 KiB
SQL
# name: test/sql/aggregate/aggregates/test_avg.test
|
|
# description: Test AVG operator
|
|
# group: [aggregates]
|
|
|
|
# scalar average
|
|
query RR
|
|
SELECT AVG(3), AVG(NULL)
|
|
----
|
|
3
|
|
NULL
|
|
|
|
query RR
|
|
SELECT AVG(3::SMALLINT), AVG(NULL::SMALLINT)
|
|
----
|
|
3
|
|
NULL
|
|
|
|
query RR
|
|
SELECT AVG(3::DOUBLE), AVG(NULL::DOUBLE)
|
|
----
|
|
3
|
|
NULL
|
|
|
|
# test average on sequence
|
|
statement ok
|
|
CREATE SEQUENCE seq;
|
|
|
|
query R
|
|
SELECT AVG(nextval('seq'))
|
|
----
|
|
1
|
|
|
|
query R
|
|
SELECT AVG(nextval('seq'))
|
|
----
|
|
2
|
|
|
|
statement ok
|
|
CREATE TABLE integers(i INTEGER);
|
|
|
|
statement ok
|
|
INSERT INTO integers VALUES (1), (2), (3)
|
|
|
|
query RRRR
|
|
SELECT AVG(i), AVG(1), AVG(DISTINCT i), AVG(NULL) FROM integers
|
|
----
|
|
2
|
|
1
|
|
2
|
|
NULL
|
|
|
|
query R
|
|
SELECT AVG(i) FROM integers WHERE i > 100
|
|
----
|
|
NULL
|
|
|
|
# Intervals
|
|
statement ok
|
|
CREATE TABLE intervals(itvl INTERVAL)
|
|
|
|
statement ok
|
|
INSERT INTO intervals VALUES
|
|
('1 day'),
|
|
('30 days'),
|
|
('30 days'),
|
|
('30 days'),
|
|
('30 days')
|
|
|
|
query II
|
|
SELECT AVG(itvl), AVG(DISTINCT itvl) FROM intervals
|
|
----
|
|
24 days 04:48:00 15 days 12:00:00
|
|
|
|
# The only test of AVG(INTERVAL) in the PG test suite...
|
|
statement ok
|
|
CREATE TABLE interval_tbl (f1 interval);
|
|
|
|
statement ok
|
|
INSERT INTO interval_tbl (f1) VALUES
|
|
('@ 1 minute'),
|
|
('@ 5 hour'),
|
|
('@ 10 day'),
|
|
('@ 34 year'),
|
|
('@ 3 months'),
|
|
('@ 14 seconds ago'),
|
|
('1 day 2 hours 3 minutes 4 seconds'),
|
|
('6 years'),
|
|
('5 months'),
|
|
('5 months 12 hours');
|
|
|
|
query I
|
|
select avg(f1) from interval_tbl;
|
|
----
|
|
4 years 1 month 10 days 04:18:23
|
|
|
|
# invalid use of average
|
|
statement error
|
|
SELECT AVG()
|
|
----
|
|
|
|
statement error
|
|
SELECT AVG(1, 2, 3)
|
|
----
|
|
|
|
statement error
|
|
SELECT AVG(AVG(1))
|
|
----
|
|
|
|
# empty average
|
|
statement ok
|
|
CREATE TABLE vals(i INTEGER, j DOUBLE, k HUGEINT);
|
|
|
|
statement ok
|
|
INSERT INTO vals VALUES (NULL, NULL, NULL)
|
|
|
|
query III
|
|
SELECT AVG(i), AVG(j), AVG(k) FROM vals;
|
|
----
|
|
NULL NULL NULL
|
|
|
|
# Temporal values
|
|
statement ok
|
|
CREATE OR REPLACE TABLE timestamps AS
|
|
SELECT range AS ts
|
|
FROM range('2024-11-01'::DATE, '2024-12-01'::DATE, INTERVAL 1 DAY)
|
|
|
|
query I
|
|
SELECT AVG(ts::DATE)
|
|
FROM timestamps
|
|
----
|
|
2024-11-15 12:00:00
|
|
|
|
query I
|
|
SELECT AVG(ts)
|
|
FROM timestamps
|
|
----
|
|
2024-11-15 12:00:00
|
|
|
|
query I
|
|
SELECT AVG(ts::TIMESTAMPTZ)
|
|
FROM timestamps
|
|
----
|
|
2024-11-15 12:00:00+00
|
|
|
|
statement ok
|
|
CREATE OR REPLACE TABLE times AS
|
|
SELECT range AS ts
|
|
FROM range('2024-11-01'::DATE, '2024-11-02'::DATE, INTERVAL 7 MINUTES)
|
|
|
|
query I
|
|
SELECT AVG(ts::TIME)
|
|
FROM times
|
|
----
|
|
11:57:30
|
|
|
|
# TIMETZ - just average the normalised times
|
|
statement ok
|
|
CREATE TABLE timetzs (ttz TIMETZ);
|
|
|
|
statement ok
|
|
INSERT INTO timetzs VALUES
|
|
(NULL),
|
|
('00:00:00+1559'),
|
|
('00:00:00+1558'),
|
|
('02:30:00'),
|
|
('02:30:00+04'),
|
|
('02:30:00+04:30'),
|
|
('02:30:00+04:30:45'),
|
|
('16:15:03.123456'),
|
|
('02:30:00+1200'),
|
|
('02:30:00-1200'),
|
|
('24:00:00-1558'),
|
|
('24:00:00-1559'),
|
|
;
|
|
|
|
query I
|
|
SELECT AVG(ttz) FROM timetzs;
|
|
----
|
|
14:44:56.193041+00
|