PostgreSQL Performance & Query Optimization · レッスン

FILTERと条件付き集計によるクエリ最適化

FILTER句とCASEベースの条件付き集計を使い、複数の個別クエリを実行せずに1回のテーブル走査で複数の指標を計算する方法を学びます。

レッスン 4/413 ステップ

「FILTERと条件付き集計によるクエリ最適化」はCoddyKit上の無料PostgreSQL Performance & Query Optimizationレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPostgreSQL Performance & Query Optimization学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 PostgreSQL Performance & Query Optimizationコースには全4レッスンが含まれています。

このレッスンの一部はまだ翻訳されておらず、英語で表示されています。

The Problem: Many Counts, One Table

Dashboards often need several metrics from the same table — total orders, paid orders, refunded orders. Running three separate queries scans the table three times. We can do it in one pass.

Conditional Aggregation with CASE

The classic trick wraps a CASE inside an aggregate. Rows that do not match contribute NULL, which COUNT and SUM ignore.

SELECT
  COUNT(*) AS total,
  COUNT(CASE WHEN status = 'paid' THEN 1 END) AS paid
FROM orders;

The Cleaner FILTER Clause

PostgreSQL offers a more readable form: the FILTER clause attached to any aggregate. It expresses intent directly.

SELECT
  COUNT(*) AS total,
  COUNT(*) FILTER (WHERE status = 'paid')     AS paid,
  COUNT(*) FILTER (WHERE status = 'refunded') AS refunded
FROM orders;

Why This Is Faster

All metrics are computed in a single scan of the table. The planner reads each row once and updates every aggregate, instead of scanning the table separately for each metric.

FILTER with SUM and AVG

FILTER works with any aggregate, not just COUNT. Compute conditional sums and averages in the same query.

SELECT
  SUM(total) FILTER (WHERE status = 'paid') AS revenue,
  AVG(total) FILTER (WHERE status = 'paid') AS avg_paid
FROM orders;

Combining with GROUP BY

FILTER shines inside grouped queries, producing a pivot-like result with one row per group and several conditional columns.

SELECT
  region,
  COUNT(*) FILTER (WHERE status = 'paid')     AS paid,
  COUNT(*) FILTER (WHERE status = 'refunded') AS refunded
FROM orders
GROUP BY region;

Pivoting Months into Columns

A common report turns rows into columns. FILTER makes a clean monthly pivot without extension functions.

SELECT
  product_id,
  SUM(total) FILTER (WHERE month = 1) AS jan,
  SUM(total) FILTER (WHERE month = 2) AS feb
FROM sales
GROUP BY product_id;

Reading the Plan

EXPLAIN ANALYZE confirms a single Aggregate node over one scan. Compare it against three separate queries to see the saved scans.

EXPLAIN ANALYZE
SELECT
  COUNT(*) FILTER (WHERE status = 'paid') AS paid,
  COUNT(*) FILTER (WHERE status = 'refunded') AS refunded
FROM orders;

FILTER vs WHERE

Remember the difference:

  • WHERE removes rows before any aggregate sees them
  • FILTER keeps all rows but restricts which ones a specific aggregate counts

Use FILTER when different aggregates need different conditions.

Combining with Indexes

If most metrics target a subset (e.g. only recent rows), add a WHERE for the shared condition so an index narrows the scan, then use FILTER for the per-metric splits.

SELECT
  COUNT(*) FILTER (WHERE status = 'paid') AS paid
FROM orders
WHERE created_at >= now() - interval '30 days';

Counting Distinct Conditionally

FILTER also pairs with COUNT(DISTINCT ...), letting you count unique customers per status in one scan instead of several grouped queries.

SELECT
  COUNT(DISTINCT customer_id) FILTER (WHERE status = 'paid') AS paying_customers
FROM orders;

Quick Check

Test your conditional aggregation knowledge.

Recap

You learned conditional aggregation:

  • Compute many metrics in one scan with FILTER or CASE
  • FILTER is more readable and works with any aggregate
  • Combine with GROUP BY for pivot-style reports
  • WHERE removes rows; FILTER restricts a single aggregate
  • Add a shared WHERE so indexes narrow the scan
無料で開始

AI チューターと学ぶ SQL — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
22
レッスン
88

よくある質問

「FILTERと条件付き集計によるクエリ最適化」レッスンは無料ですか?

はい。「FILTERと条件付き集計によるクエリ最適化」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、PostgreSQL Performance & Query Optimizationコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 PostgreSQL Performance & Query Optimizationコースには全4レッスンが含まれています。

「FILTERと条件付き集計によるクエリ最適化」で何を学びますか?

FILTER句とCASEベースの条件付き集計を使い、複数の個別クエリを実行せずに1回のテーブル走査で複数の指標を計算する方法を学びます。 ブラウザで直接実行するハンズオンコードでPostgreSQL Performance & Query Optimizationを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

PostgreSQL Performance & Query Optimizationを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのPostgreSQL Performance & Query Optimizationは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「FILTERと条件付き集計によるクエリ最適化」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このPostgreSQL Performance & Query Optimizationレッスンでコードを書いて実行できますか?

はい。すべてのPostgreSQL Performance & Query Optimizationレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 集約関数とウィンドウ関数の最適化
  2. 再帰CTEとグラフクエリ
  3. パフォーマンス向上のためのマテリアライズドビュー
  4. FILTERと条件付き集計によるクエリ最適化
← PostgreSQL Performance & Query Optimizationに戻る