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 kamuuser_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_id | order_id | order_date | order_amount | row_num |
|---|---|---|---|---|
| U001 | O-101 | 2024-01-05 | 150000 | 1 |
| U001 | O-215 | 2024-02-18 | 320000 | 2 |
| U001 | O-389 | 2024-03-30 | 95000 | 3 |
| U002 | O-110 | 2024-01-12 | 210000 | 1 |
| U002 | O-402 | 2024-04-07 | 480000 | 2 |
Variasi
- Ganti
ORDER BY order_date ASCkeDESCuntuk nomor urut dari yang paling baru - Tambahkan
WHERE row_num = 1(atau pakaiQUALIFYdi BigQuery/Snowflake) untuk ambil hanya baris pertama per user - Ganti
user_iddenganproduct_idatauregionuntuk 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.