The analytical wins compound Column Stores Under the Hood's mechanisms. Q1 touches 3 of 15 columns: DuckDB 61,228 decodes three compressed columns in vectors on four threads, while PostgreSQL 1,289 deforms every tuple of a 2,432-page heap and filters row by row. PostgreSQL's numeric is a software decimal; DuckDB's DECIMAL(10,2) sum is vectorized integer addition. In Q3, count(DISTINCT ...) cannot be split across PostgreSQL's workers (EXPLAIN ANALYZE in Parallel), so one process sorts every row, while DuckDB deduplicates in parallel hash tables. Q2 and Q4 spend more time in joins, sorts and windows, where both engines do real work per group, so the ratio is smaller.
The point lookup reverses this. PostgreSQL's B-tree descends a few pages and fetches one heap page. DuckDB has no index here (a PRIMARY KEY would add an ART index); zone maps pick the row group that can hold order 54321 and it scans that group, and fixed per-query costs dwarf a one-row answer. The update cost the same in both, but hides the real difference: PostgreSQL lets hundreds of sessions update different rows at once under row locks, while DuckDB allows one writing process (In-Memory vs Persistent) and rewrites compressed segments to change values, which suits batch loads, not streams of small writes.