# 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