Building data-driven components and applications doesn't have to be so ducking hardWasm SDK

Back to Table of Contents

This is a summary of a book chapter from DuckDB in Action, published by Manning. Download the complete book for free to read the complete chapter.

Chapter 4: Advanced Aggregation and Analysis of Data

Pre-aggregate Data While Ingesting

Pre-aggregating data during ingestion can help handle inconsistencies and prepare data for analysis. DuckDB's time_bucket() function is used to truncate timestamps and align them into buckets, facilitating the aggregation of sensor readings.

Summarizing Data

Understanding the basic characteristics of a dataset is crucial before deep analysis. DuckDB’s SUMMARIZE command provides a quick overview of the dataset, including the number of values, distribution, and magnitude of numerical values without ingestion.

On Sub-queries

Sub-queries allow for the computation of nested aggregates and other complex queries. Uncorrelated sub-queries operate independently of the outer query, while correlated sub-queries depend on values from the outer query.

Grouping Sets

Grouping sets enable the computation of aggregates over multiple groups, providing different levels of detail. ROLLUP and CUBE clauses automatically generate subgroups or combinations of grouping keys for comprehensive reports.

Window Functions

Window functions allow for complex data analysis without reducing the number of rows. They facilitate tasks such as ranking, computing running totals, and accessing preceding or following rows. These functions are defined using the OVER() clause.

Conditions and Filtering Outside the WHERE Clause

Advanced filtering of computed aggregates or window function results requires the use of HAVING, QUALIFY, and FILTER clauses. These clauses allow for post-aggregation filtering, window-specific filtering, and excluding unwanted data from aggregates, respectively.

The PIVOT Statement

Pivoting reorganizes data tables to present different perspectives. DuckDB's PIVOT clause dynamically pivots tables on arbitrary expressions, allowing for the creation of reports where specific values form the columns.

Using the ASOF JOIN

The ASOF JOIN facilitates working with time-series data by joining on inequality conditions, ensuring that the closest valid timestamp is used for joining, addressing gaps where exact matches are not present.

Using Table Functions

Table functions return collections of rows and can be used in any context where a table is allowed. DuckDB supports a variety of table functions that can handle external resources like files or URLs, enhancing flexibility in data processing.

Using LATERAL Joins

LATERAL joins are used when the inner query needs to be evaluated for each row of the outer query. This is particularly useful for unnesting arrays or fanning out data, enabling the evaluation of sub-queries that produce rows dynamically based on the outer query.


Modern SQL features supported by DuckDB, such as CTEs, window functions, and list aggregations, provide powerful tools for data aggregation and analysis. Grouping sets, window functions, and advanced filtering mechanisms enhance analytical capabilities. DuckDB's ASOF and LATERAL joins offer robust solutions for time-series data and complex query requirements.