Q71🪟Ranking & Window Functions★★☆☆☆Ganti tabel/kolomSafe to Run

ROW_NUMBER per Partition

Dialect:bigquerypostgresqlsnowflakemysql
#row-number#partition#window#ranking

Kapan Pakai Query Ini

Kamu butuh nomor urut per grup. Misalnya urutan transaksi per user, urutan produk per kategori, atau urutan event per session. ROW_NUMBER() adalah fondasi dari hampir semua pola deduplication dan top-N, jadi penting banget untuk dikuasai duluan.

Yang Perlu Diganti

  • orders → nama tabel transaksi/event kamu
  • user_id → kolom yang jadi "grup" (PARTITION BY)
  • order_date → kolom yang menentukan urutan (ORDER BY)

Query

SELECT
  user_id,
  order_id,
  order_date,
  order_amount,
  ROW_NUMBER() OVER (
    PARTITION BY user_id
    ORDER BY order_date ASC
  ) AS row_num
FROM orders
ORDER BY
  user_id,
  row_num;

Contoh Output

user_idorder_idorder_dateorder_amountrow_num
U001O-1012024-01-051500001
U001O-2152024-02-183200002
U001O-3892024-03-30950003
U002O-1102024-01-122100001
U002O-4022024-04-074800002

Variasi

  • Ganti ORDER BY order_date ASC ke DESC untuk nomor urut dari yang paling baru
  • Tambahkan WHERE row_num = 1 (atau pakai QUALIFY di BigQuery/Snowflake) untuk ambil hanya baris pertama per user
  • Ganti user_id dengan product_id atau region untuk partisi yang berbeda
  • Kombinasikan dengan PARTITION BY user_id, EXTRACT(YEAR FROM order_date) untuk urutan per user per tahun

Variasi Dialect

Sama di semua dialect. ANSI SQL standard.

ROW_NUMBER per Partition — Analyst SQL Vault | NgulikSQL