should be it
This commit is contained in:
219
external/duckdb/test/sql/aggregate/qualify/test_qualify.test
vendored
Normal file
219
external/duckdb/test/sql/aggregate/qualify/test_qualify.test
vendored
Normal file
@@ -0,0 +1,219 @@
|
||||
# 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
|
||||
52
external/duckdb/test/sql/aggregate/qualify/test_qualify_macro.test
vendored
Normal file
52
external/duckdb/test/sql/aggregate/qualify/test_qualify_macro.test
vendored
Normal file
@@ -0,0 +1,52 @@
|
||||
# name: test/sql/aggregate/qualify/test_qualify_macro.test
|
||||
# description: Test QUALIFY clause in the subquery of a macro function
|
||||
# group: [qualify]
|
||||
|
||||
# load the DB from disk
|
||||
load __TEST_DIR__/macro_storage.db
|
||||
|
||||
statement ok
|
||||
PRAGMA disable_checkpoint_on_shutdown
|
||||
|
||||
statement ok
|
||||
PRAGMA wal_autocheckpoint='1TB';
|
||||
|
||||
statement ok
|
||||
CREATE TABLE test (a INTEGER, b INTEGER);
|
||||
|
||||
statement ok
|
||||
INSERT INTO test VALUES (11, 22), (13, 22), (12, 21)
|
||||
|
||||
# create a macro
|
||||
statement ok
|
||||
CREATE MACRO plus1(x) AS (x + (SELECT COUNT(*) FROM (SELECT b, SUM(test.a) FROM test GROUP BY b QUALIFY row_number() OVER (PARTITION BY b) = 1)))
|
||||
|
||||
# use the macro
|
||||
query T
|
||||
SELECT plus1(3)
|
||||
----
|
||||
5
|
||||
|
||||
loop i 0 2
|
||||
|
||||
# restart the system
|
||||
restart
|
||||
|
||||
query T
|
||||
SELECT plus1(5)
|
||||
----
|
||||
7
|
||||
|
||||
# drop the macro again
|
||||
statement ok
|
||||
DROP MACRO plus1
|
||||
|
||||
statement error
|
||||
SELECT plus1(2)
|
||||
----
|
||||
|
||||
# after recreating the macro we can use it again
|
||||
statement ok
|
||||
CREATE MACRO plus1(x) AS (x + (SELECT COUNT(*) FROM (SELECT b, SUM(test.a) FROM test GROUP BY b QUALIFY row_number() OVER (PARTITION BY b) = 1)))
|
||||
|
||||
endloop
|
||||
86
external/duckdb/test/sql/aggregate/qualify/test_qualify_view.test
vendored
Normal file
86
external/duckdb/test/sql/aggregate/qualify/test_qualify_view.test
vendored
Normal file
@@ -0,0 +1,86 @@
|
||||
# name: test/sql/aggregate/qualify/test_qualify_view.test
|
||||
# description: Test QUALIFY clause in a view over different runs
|
||||
# group: [qualify]
|
||||
|
||||
require skip_reload
|
||||
|
||||
# load the DB from disk
|
||||
load __TEST_DIR__/view_storage.db
|
||||
|
||||
statement ok
|
||||
set enable_view_dependencies=true
|
||||
|
||||
statement ok
|
||||
PRAGMA disable_checkpoint_on_shutdown
|
||||
|
||||
statement ok
|
||||
PRAGMA wal_autocheckpoint='1TB';
|
||||
|
||||
# create a schema and view
|
||||
statement ok
|
||||
CREATE SCHEMA test;
|
||||
|
||||
statement ok
|
||||
CREATE TABLE test.t (a INTEGER, b INTEGER);
|
||||
|
||||
statement ok
|
||||
INSERT INTO test.t VALUES (11, 22), (13, 22), (12, 21)
|
||||
|
||||
statement ok
|
||||
CREATE VIEW test.v AS SELECT * FROM test.t QUALIFY row_number() OVER (PARTITION BY b) = 1;
|
||||
|
||||
query II
|
||||
SELECT b, SUM(a)
|
||||
FROM test.v
|
||||
GROUP BY b
|
||||
QUALIFY row_number() OVER (PARTITION BY b) = 1
|
||||
ORDER BY ALL
|
||||
----
|
||||
21 12
|
||||
22 11
|
||||
|
||||
# drop the table the view is based on
|
||||
statement error
|
||||
DROP TABLE test.t
|
||||
----
|
||||
view "v" depends on table "t".
|
||||
|
||||
statement ok
|
||||
DROP TABLE test.t CASCADE;
|
||||
|
||||
loop i 0 2
|
||||
|
||||
# restart the system
|
||||
restart
|
||||
|
||||
# we first need to recreate both the table and the view before we can query it again
|
||||
statement ok
|
||||
CREATE TABLE test.t (a INTEGER, b INTEGER);
|
||||
|
||||
statement ok
|
||||
INSERT INTO test.t VALUES (11, 22), (13, 22), (12, 21)
|
||||
|
||||
statement ok
|
||||
CREATE VIEW test.v AS SELECT * FROM test.t QUALIFY row_number() OVER (PARTITION BY b) = 1;
|
||||
|
||||
query II
|
||||
SELECT b, SUM(a)
|
||||
FROM test.v
|
||||
GROUP BY b
|
||||
QUALIFY row_number() OVER (PARTITION BY b) = 1
|
||||
ORDER BY ALL
|
||||
----
|
||||
21 12
|
||||
22 11
|
||||
|
||||
# drop the table again
|
||||
statement ok
|
||||
DROP TABLE test.t CASCADE;
|
||||
|
||||
# dropping the table also caused the view to be dropped
|
||||
statement error
|
||||
SELECT * FROM test.v
|
||||
----
|
||||
Catalog Error: Table with name v does not exist!
|
||||
|
||||
endloop
|
||||
71
external/duckdb/test/sql/aggregate/qualify/test_qualify_view_no_view_dependencies.test
vendored
Normal file
71
external/duckdb/test/sql/aggregate/qualify/test_qualify_view_no_view_dependencies.test
vendored
Normal file
@@ -0,0 +1,71 @@
|
||||
# name: test/sql/aggregate/qualify/test_qualify_view_no_view_dependencies.test
|
||||
# description: Test QUALIFY clause in a view over different runs
|
||||
# group: [qualify]
|
||||
|
||||
# load the DB from disk
|
||||
load __TEST_DIR__/view_storage.db
|
||||
|
||||
statement ok
|
||||
PRAGMA disable_checkpoint_on_shutdown
|
||||
|
||||
statement ok
|
||||
PRAGMA wal_autocheckpoint='1TB';
|
||||
|
||||
# create a schema and view
|
||||
statement ok
|
||||
CREATE SCHEMA test;
|
||||
|
||||
statement ok
|
||||
CREATE TABLE test.t (a INTEGER, b INTEGER);
|
||||
|
||||
statement ok
|
||||
INSERT INTO test.t VALUES (11, 22), (13, 22), (12, 21)
|
||||
|
||||
statement ok
|
||||
CREATE VIEW test.v AS SELECT * FROM test.t QUALIFY row_number() OVER (PARTITION BY b) = 1;
|
||||
|
||||
query II
|
||||
SELECT b, SUM(a)
|
||||
FROM test.v
|
||||
GROUP BY b
|
||||
QUALIFY row_number() OVER (PARTITION BY b) = 1
|
||||
ORDER BY ALL
|
||||
----
|
||||
21 12
|
||||
22 11
|
||||
|
||||
# drop the table the view is based on
|
||||
statement ok
|
||||
DROP TABLE test.t
|
||||
|
||||
loop i 0 2
|
||||
|
||||
# restart the system
|
||||
restart
|
||||
|
||||
# after recreating the table, we can query the view again
|
||||
statement ok
|
||||
CREATE TABLE test.t (a INTEGER, b INTEGER);
|
||||
|
||||
statement ok
|
||||
INSERT INTO test.t VALUES (11, 22), (13, 22), (12, 21)
|
||||
|
||||
query II
|
||||
SELECT b, SUM(a)
|
||||
FROM test.v
|
||||
GROUP BY b
|
||||
QUALIFY row_number() OVER (PARTITION BY b) = 1
|
||||
ORDER BY ALL
|
||||
----
|
||||
21 12
|
||||
22 11
|
||||
|
||||
# drop the table again
|
||||
statement ok
|
||||
DROP TABLE test.t
|
||||
|
||||
statement error
|
||||
SELECT * FROM test.v
|
||||
----
|
||||
|
||||
endloop
|
||||
Reference in New Issue
Block a user