SQL statements


SQL Statements


Searchable History

DuckDB supports Reverse Search. Press Ctrl + R and start typing a part of an old query (e.g., "COPY" or "SUMMARIZE"). It will find the last time you ran that command.


QUALIFY is a popular clause in BigQuery, Snowflake, and Teradata. It acts like a HAVING clause but for Window Functions (like ROW_NUMBER() or RANK()).

How It Works

The logical order of operations in SQL is typically: FROMWHEREGROUP BYHAVINGWINDOWSELECT.

Because WHERE happens before window functions are calculated, you can't use a window function inside a WHERE clause. QUALIFY acts like a HAVING clause, but specifically for those window calculations.

Example: Finding the Top Performer

Imagine you have a table of salespeople and you want to find only the top seller in each region.

The "Old" Way (Postgres/Standard SQL):

The DuckDB Way with QUALIFY:

Key Advantages in DuckDB

  • Less Code: You avoid the "Select * From (Select * From...)" nesting dolls.

  • Calculations on the Fly: You don't even have to include the window function in your SELECT list to filter by it. DuckDB can calculate it in the background just for the QUALIFY check.

  • Readability: It keeps the focus on your business logic (e.g., "Give me the most recent record") rather than the structural limitations of SQL.

DuckDB's Secret Weapon: COLUMNS()

DuckDB also allows you to combine QUALIFY with its COLUMNS() expression. For example, if you wanted to filter out any row where any numeric column’s moving average exceeds a certain threshold, you can do that very concisely.

Comparison Table: WHERE vs. HAVING vs. QUALIFY

Clause

Filters Based On...

Can use Window Functions?

WHERE

Individual row data

❌ No

HAVING

Grouped/Aggregated data (SUM, COUNT)

❌ No

QUALIFY

Window Function results (RANK, LEAD)

✅ Yes


Last updated