219 lines
6.6 KiB
SQL
219 lines
6.6 KiB
SQL
# name: test/sql/aggregate/qualify/test_qualify.test
|
|
# description: Test QUALIFY clause
|
|
# group: [qualify]
|
|
|
|
statement ok
|
|
PRAGMA enable_verification
|
|
|
|
statement ok
|
|
CREATE TABLE test (a INTEGER, b INTEGER);
|
|
|
|
statement ok
|
|
INSERT INTO test VALUES (11, 22), (13, 22), (12, 21)
|
|
|
|
statement ok
|
|
CREATE TABLE qt (a INTEGER, b CHAR(1), c INTEGER);
|
|
|
|
statement ok
|
|
INSERT INTO qt VALUES (1, 'A', 1), (2, 'A', 2), (3, 'B', 1), (4, 'B', 2)
|
|
|
|
# basic test
|
|
query ITI
|
|
SELECT * from qt QUALIFY row_number() over (PARTITION BY b ORDER BY c) = 1 ORDER BY b
|
|
----
|
|
1 A 1
|
|
3 B 1
|
|
|
|
query ITII
|
|
SELECT a, b, c, row_number() over (PARTITION BY b ORDER BY c) as row_num FROM qt QUALIFY row_num = 1 ORDER BY b
|
|
----
|
|
1 A 1 1
|
|
3 B 1 1
|
|
|
|
statement ok
|
|
CREATE TABLE exam (student TEXT, subject TEXT, mark INTEGER);
|
|
|
|
statement ok
|
|
INSERT INTO exam VALUES
|
|
('Lily', 'Maths', 65),
|
|
('Lily', 'Science', 80),
|
|
('Lily', 'english', 70),
|
|
('Isabella', 'Maths', 50),
|
|
('Isabella', 'Science', 70),
|
|
('Isabella', 'english', 90),
|
|
('Olivia', 'Maths', 55),
|
|
('Olivia', 'Science', 60),
|
|
('Olivia', 'english', 89);
|
|
|
|
query TTI
|
|
SELECT * FROM exam QUALIFY rank() OVER (ORDER BY mark desc) = 4
|
|
----
|
|
Lily english 70
|
|
Isabella Science 70
|
|
|
|
query TTI
|
|
SELECT * FROM exam QUALIFY rank() OVER (PARTITION BY student ORDER BY mark DESC) = 2 ORDER BY student
|
|
----
|
|
Isabella Science 70
|
|
Lily english 70
|
|
Olivia Science 60
|
|
|
|
query TTI
|
|
SELECT * FROM exam WINDOW w AS (ORDER BY mark) QUALIFY row_number() OVER w >= 1 AND (rank() OVER w) <= 2 ORDER BY student
|
|
----
|
|
Isabella Maths 50
|
|
Olivia Maths 55
|
|
|
|
query TTI
|
|
SELECT * FROM exam QUALIFY first_value(mark) OVER (PARTITION BY student ORDER BY mark) >= 60 order by mark
|
|
----
|
|
Lily Maths 65
|
|
Lily english 70
|
|
Lily Science 80
|
|
|
|
query TTI
|
|
SELECT * FROM exam QUALIFY last_value(mark) OVER (PARTITION BY student ORDER BY mark) >= 85 order by mark
|
|
----
|
|
Olivia english 89
|
|
Isabella english 90
|
|
|
|
statement ok
|
|
CREATE TABLE power (plant TEXT, date DATE, mwh INTEGER);
|
|
|
|
statement ok
|
|
INSERT INTO power VALUES
|
|
('Boston', '2019-01-02', 564337),
|
|
('Boston', '2019-01-03', 507405),
|
|
('Boston', '2019-01-04', 528523),
|
|
('Boston', '2019-01-05', 469538),
|
|
('Boston', '2019-01-06', 474163),
|
|
('Boston', '2019-01-07', 507213),
|
|
('Boston', '2019-01-08', 613040),
|
|
('Boston', '2019-01-09', 582588),
|
|
('Boston', '2019-01-10', 499506),
|
|
('Boston', '2019-01-11', 482014),
|
|
('Boston', '2019-01-12', 486134),
|
|
('Boston', '2019-01-13', 531518),
|
|
('Worcester', '2019-01-02', 118860),
|
|
('Worcester', '2019-01-03', 101977),
|
|
('Worcester', '2019-01-04', 106054),
|
|
('Worcester', '2019-01-05', 92182),
|
|
('Worcester', '2019-01-06', 94492),
|
|
('Worcester', '2019-01-07', 99932),
|
|
('Worcester', '2019-01-08', 118854),
|
|
('Worcester', '2019-01-09', 113506),
|
|
('Worcester', '2019-01-10', 96644),
|
|
('Worcester', '2019-01-11', 93806),
|
|
('Worcester', '2019-01-12', 98963),
|
|
('Worcester', '2019-01-13', 107170);
|
|
|
|
# qualify with ORDER
|
|
query TTI
|
|
SELECT * FROM power QUALIFY rank() OVER (PARTITION BY plant ORDER BY date DESC) = 2 ORDER BY plant
|
|
----
|
|
Boston 2019-01-12 486134
|
|
Worcester 2019-01-12 98963
|
|
|
|
query TTR
|
|
SELECT * FROM (SELECT plant, date, avg(mwh) OVER (PARTITION BY plant ORDER BY date ASC RANGE BETWEEN INTERVAL 3 DAYS PRECEDING AND INTERVAL 3 DAYS FOLLOWING) AS avgmwh FROM power
|
|
ORDER BY plant, avgmwh DESC) QUALIFY row_number() OVER (PARTITION BY plant ORDER BY avgmwh DESC) = 1 ORDER BY plant
|
|
----
|
|
Boston 2019-01-11 532466.666667
|
|
Worcester 2019-01-11 104823.833333
|
|
|
|
# QUALIFY with condition on ALIAS
|
|
query II
|
|
SELECT b, SUM(a) AS sum FROM test GROUP BY b QUALIFY row_number() OVER (PARTITION BY b) >= 1 AND sum < 20 ORDER BY b;
|
|
----
|
|
21 12
|
|
|
|
# expression in qualify
|
|
statement ok
|
|
SELECT b, SUM(a) AS sum FROM test GROUP BY b QUALIFY row_number() OVER (PARTITION BY b) > sum * 10;
|
|
|
|
query ITI
|
|
SELECT * FROM qt QUALIFY row_number() OVER (PARTITION BY b ORDER BY c) = (SELECT max(c) FROM qt) ORDER BY b;
|
|
----
|
|
2 A 2
|
|
4 B 2
|
|
|
|
statement ok
|
|
CREATE TABLE tenk1 (unique1 int4, unique2 int4, two int4, four int4, ten int4, twenty int4, hundred int4, thousand int4, twothousand int4, fivethous int4, tenthous int4, odd int4, even int4, stringu1 varchar, stringu2 varchar, string4 varchar)
|
|
|
|
statement ok
|
|
insert into tenk1 values (8800,0,0,0,0,0,0,800,800,3800,8800,0,1,'MAAAAA','AAAAAA','AAAAxx'), (1891,1,1,3,1,11,91,891,1891,1891,1891,182,183,'TUAAAA','BAAAAA','HHHHxx'), (3420,2,0,0,0,0,20,420,1420,3420,3420,40,41,'OBAAAA','CAAAAA','OOOOxx'), (9850,3,0,2,0,10,50,850,1850,4850,9850,100,101,'WOAAAA','DAAAAA','VVVVxx'), (7164,4,0,0,4,4,64,164,1164,2164,7164,128,129,'OPAAAA','EAAAAA','AAAAxx'), (8009,5,1,1,9,9,9,9,9,3009,8009,18,19,'BWAAAA','FAAAAA','HHHHxx'), (5057,6,1,1,7,17,57,57,1057,57,5057,114,115,'NMAAAA','GAAAAA','OOOOxx'), (6701,7,1,1,1,1,1,701,701,1701,6701,2,3,'TXAAAA','HAAAAA','VVVVxx'), (4321,8,1,1,1,1,21,321,321,4321,4321,42,43,'FKAAAA','IAAAAA','AAAAxx'), (3043,9,1,3,3,3,43,43,1043,3043,3043,86,87,'BNAAAA','JAAAAA','HHHHxx')
|
|
|
|
# cume_dist
|
|
query I
|
|
SELECT unique1 FROM tenk1 QUALIFY cast(cume_dist() OVER (PARTITION BY four ORDER BY ten)*10 as integer) = 5 order by four, ten
|
|
----
|
|
6701
|
|
4321
|
|
1891
|
|
|
|
# first_value
|
|
query I
|
|
SELECT unique1 FROM tenk1 QUALIFY first_value(ten) OVER (PARTITION BY four ORDER BY ten) = 1 order by four, ten
|
|
----
|
|
6701
|
|
4321
|
|
5057
|
|
8009
|
|
1891
|
|
3043
|
|
|
|
# lead
|
|
query I
|
|
SELECT unique1 FROM tenk1 qualify lead(ten * 2, 1, -1) OVER (PARTITION BY four ORDER BY ten) = -1 order by four, ten
|
|
----
|
|
7164
|
|
8009
|
|
9850
|
|
3043
|
|
|
|
# using in subquery
|
|
query I
|
|
SELECT *
|
|
FROM (
|
|
SELECT b FROM test as t
|
|
GROUP BY b
|
|
QUALIFY rank() OVER (PARTITION BY t.b) = 1
|
|
)
|
|
QUALIFY row_number() OVER (PARTITION BY b) = 1
|
|
ORDER BY 1
|
|
----
|
|
21
|
|
22
|
|
|
|
query II
|
|
SELECT * FROM test QUALIFY row_number() OVER (PARTITION BY test.b) = (SELECT max(a) FROM qt GROUP BY qt.b QUALIFY rank() OVER (PARTITION BY qt.b) = 1 order by qt.b limit 1)
|
|
----
|
|
13 22
|
|
|
|
# in the order of WINDOW clause
|
|
statement ok
|
|
SELECT * FROM exam WINDOW w AS (ORDER BY mark) QUALIFY row_number() OVER w = 1
|
|
|
|
# must appear WINDOW clause before QUALIFY clause
|
|
statement error
|
|
SELECT * FROM exam QUALIFY row_number() OVER w = 1 WINDOW w AS (ORDER BY mark)
|
|
----
|
|
Parser Error: syntax error at or near "WINDOW"
|
|
|
|
# QUALIFY clause requires at least one window function to be specified in at least one of the SELECT column list or the filter predicate of the QUALIFY clause
|
|
statement error
|
|
SELECT b, avg(a) AS avga FROM test GROUP BY b QUALIFY avga > 10
|
|
----
|
|
Binder Error: at least one window function must appear in the SELECT
|
|
|
|
# invalid window function
|
|
statement error
|
|
SELECT b FROM test QUALIFY avga() > 10
|
|
----
|
|
Catalog Error: Scalar Function with name avga does not exist
|
|
|
|
# column not found in from clause and can't find in alias map
|
|
statement error
|
|
SELECT b, SUM(a) FROM test GROUP BY b QUALIFY row_number() OVER (PARTITION BY b) > sum;
|
|
----
|
|
Binder Error: Referenced column sum not found in FROM clause |