Can I use… qualify clause (window functions)


Apache DerbyBigQueryDb2 (LUW)H2MariaDBMySQLOracle DBPostgreSQLSQL ServerSQLite20132015201720192021⊘ 3.25.0 - 3.42.0⊘ 2008R2 - 2022⊘ 8.4 - 15⊘ 11gR1 - 21c⊘ 8.0.11 - 8.0.33⊘ 10.2 - 10.11✓ 1.4.198+⊘ 9.7 - 11.5.8✓ 2.0+⊘ 2.0

Neither the where nor the having clause allow window functions—but the qualify clause does.

 SELECT *
   FROM …
QUALIFY ROW_NUMBER() OVER(PARTITION BY … ORDER BY …) <= 3

The example is a top-n per group query: it returns the first three rows for each partition.

A better supported query to get the same result pushes the window function into the select clause of a sub-query and uses the where clause in the outer query for filtering.

SELECT *
  FROM (SELECT *
             , ROW_NUMBER() OVER(PARTITION BY … ORDER BY …) AS rn
          FROM …
       ) AS sq
 WHERE sq.rn <= 3

Note that this query returns the extra column “rn”.

Normative References

The qualify clause is not defined in the SQL standard ISO/IEC 9075:2016-2.

You can’t catch up on 20 years of SQL evolution in one day. Subscribe the newsletter via E-Mail, Twitter or RSS to gradually catch up and to keep modern-⁠sql.com on your radar.

About the Author

Photo of Markus Winand

Markus Winand provides insights into SQL and shows how different systems support it at modern-sql.com. Previously he made use-the-index-luke.com, which is still actively maintained. Markus can be hired as trainer, speaker and consultant via winand.at.

Buy the Book

Cover of “SQL Performance Explained”: Squirrel running on grass

The essence of SQL tuning in 200 pages

Buy now!
(paperback and/or PDF)

Paperback also available at Amazon.com.

Hire Markus

Markus offers SQL training and consulting for developers working at companies of all sizes.
Learn more »

Connect with Markus Winand

Markus Winand on LinkedInMarkus Winand on XINGMarkus Winand on Twitter
“modern SQL” by Markus Winand is licensed under a Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 Unported License.
Legal | Contact | NO WARRANTY | Trademarks | Privacy and GDPR | CC-BY-NC-ND 3.0 license