0Pricing
Coding Interview Prep · Pelajaran

Menentukan Kohort berdasarkan Tindakan Pertama

Menetapkan setiap pengguna ke kohort berdasarkan tanggal kejadian pertamanya.

Menentukan Kohort berdasarkan Tindakan Pertama adalah pelajaran Coding Interview Prep gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Coding Interview Prep, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Coding Interview Prep mencakup 4 pelajaran total.

Mengapa Kohort Muncul dalam Wawancara

Saat pewawancara analitik produk mengatakan "buatlah sebuah kohort", mereka menguji apakah Anda dapat menetapkan setiap pengguna ke dalam kelompok berdasarkan kapan mereka pertama kali melakukan sesuatu, lalu melacak kelompok tersebut dari waktu ke waktu.

Kohort adalah sekumpulan pengguna yang memiliki peristiwa awal pada periode yang sama, biasanya pembelian, pendaftaran, atau aktivitas masuk pertama mereka. Keunggulan kohort adalah memungkinkan Anda membandingkan pengguna secara setara: setiap pengguna dalam kohort Januari diukur sejak awal Januari mereka sendiri.

Keterampilan dasar pertama, dan keterampilan yang dilatih dalam pelajaran ini, adalah menghitung tanggal tindakan pertama setiap pengguna secara andal.

Tabel Sumber

Hampir setiap pertanyaan tentang kohort dimulai dari tabel peristiwa: satu baris untuk setiap tindakan pengguna, lengkap dengan stempel waktu. Bayangkan tabel events:

  • user_id — siapa yang bertindak
  • event_type — tindakan yang dilakukan
  • event_at — kapan, sebagai stempel waktu

Dalam wawancara, jelaskan tingkat perincian datanya: "Apakah ini satu baris untuk setiap peristiwa, dan dapatkah seorang pengguna muncul berkali-kali?" Jawabannya hampir selalu ya, dan itulah alasan Anda perlu melakukan agregasi untuk meringkasnya menjadi tindakan pertama setiap pengguna.

CREATE TABLE events (
  user_id    INT,
  event_type VARCHAR(50),
  event_at   TIMESTAMP
);

Tindakan Pertama = MIN Stempel Waktu

Langkah intinya sederhana: kelompokkan berdasarkan user_id dan ambil MIN(event_at). Nilai minimum tersebut adalah tindakan pertama pengguna, yaitu momen yang menempatkan mereka ke dalam sebuah kohort.

Inilah jawaban yang ingin pertama kali didengar pewawancara, sebelum tambahan fungsi jendela apa pun. GROUP BY biasa sudah benar, mudah dibaca, dan cepat.

SELECT
  user_id,
  MIN(event_at) AS first_action_at
FROM events
GROUP BY user_id;

Menyaring Berdasarkan Peristiwa Penentu

Sering kali kohort ditentukan oleh tindakan tertentu, bukan sembarang peristiwa. "Kelompokkan pengguna berdasarkan pembelian pertama mereka" berarti Anda harus menyaring baris pembelian sebelum mengambil nilai minimum.

Letakkan penyaring di WHERE agar MIN hanya melihat baris yang memenuhi syarat. Jebakan wawancara yang umum adalah mengambil MIN dari semua peristiwa lalu menyaring setelahnya. Cara itu akan menetapkan tanggal mulai yang salah bagi siapa pun yang menjelajah sebelum melakukan pembelian.

SELECT
  user_id,
  MIN(event_at) AS first_purchase_at
FROM events
WHERE event_type = 'purchase'
GROUP BY user_id;

Mengelompokkan ke dalam Periode Kohort

Kohort biasanya berupa periode, bukan stempel waktu yang persis: "kohort 2024-03" atau "minggu yang dimulai pada 2024-03-04". Potong tanggal tindakan pertama ke tingkat perincian periode tersebut.

Di Postgres, gunakan DATE_TRUNC('month', ...). Di MySQL, Anda dapat menggunakan DATE_FORMAT(d, '%Y-%m-01'); di SQL Server, DATETRUNC(month, d) atau tanggal pertama bulan yang dihitung. Sebutkan dialek Anda dalam wawancara agar pilihan sintaks terlihat disengaja.

SELECT
  user_id,
  DATE_TRUNC('month', MIN(event_at)) AS cohort_month
FROM events
WHERE event_type = 'purchase'
GROUP BY user_id;

Membungkusnya dalam CTE

Penetapan kohort per pengguna adalah komponen dasar yang akan Anda gunakan kembali dalam kueri retensi, jadi kemaslah dalam CTE dengan nama yang jelas. Dengan begitu, langkah-langkah berikutnya lebih mudah dibaca dan menunjukkan bahwa Anda berpikir dalam komponen yang dapat dirangkai.

Mulai dari sini, setiap kueri lanjutan dapat bergabung kembali dengan user_cohort untuk mengetahui kelompok pengguna tersebut.

WITH user_cohort AS (
  SELECT
    user_id,
    DATE_TRUNC('month', MIN(event_at)) AS cohort_month
  FROM events
  WHERE event_type = 'purchase'
  GROUP BY user_id
)
SELECT * FROM user_cohort;

Ukuran Kohort: Menghitung Anggota

Pemeriksaan kewajaran pertama yang diharapkan pewawancara adalah ukuran kohort: jumlah pengguna dalam setiap kohort. Kelompokkan CTE penetapan berdasarkan cohort_month dan hitung pengguna yang berbeda.

Gunakan COUNT(DISTINCT user_id) sebagai langkah pencegahan meskipun CTE tersebut sudah memiliki satu baris per pengguna; ini menunjukkan bahwa Anda memikirkan tingkat perincian data. Jumlah ini akan menjadi penyebut untuk setiap persentase retensi berikutnya.

WITH user_cohort AS (
  SELECT user_id, DATE_TRUNC('month', MIN(event_at)) AS cohort_month
  FROM events WHERE event_type = 'purchase'
  GROUP BY user_id
)
SELECT
  cohort_month,
  COUNT(DISTINCT user_id) AS cohort_size
FROM user_cohort
GROUP BY cohort_month
ORDER BY cohort_month;

Alternatif Fungsi Jendela

Terkadang pewawancara meminta label kohort yang terlampir pada setiap baris peristiwa, bukan tabel yang sudah diringkas. Di sini fungsi jendela sangat berguna: MIN(event_at) OVER (PARTITION BY user_id) menghitung tindakan pertama tanpa menghapus baris.

Ini berguna ketika Anda memerlukan peristiwa terperinci sekaligus label kohort dalam satu proses, yang menjadi dasar untuk menghitung retensi.

SELECT
  user_id,
  event_at,
  DATE_TRUNC('month',
    MIN(event_at) OVER (PARTITION BY user_id)
  ) AS cohort_month
FROM events
WHERE event_type = 'purchase';

Jebakan Nilai yang Sama dan Duplikat

Bagaimana jika seorang pengguna memiliki dua peristiwa pada stempel waktu paling awal yang persis sama? MIN menanganinya dengan baik: fungsi ini menghasilkan satu nilai minimum tersebut, berapa pun jumlah baris yang memiliki nilai sama, sehingga penetapan kohort tetap satu per pengguna.

Bandingkan dengan pendekatan ROW_NUMBER() ... ORDER BY event_at, yang memutuskan nilai yang sama secara sembarang. Anda harus menambahkan penentu seri yang deterministik (seperti event_id) untuk mendapatkan hasil yang konsisten. Menyebutkan kompromi ini tanpa diminta menunjukkan pemahaman tingkat lanjut.

SELECT user_id, event_at,
  ROW_NUMBER() OVER (
    PARTITION BY user_id
    ORDER BY event_at, event_id
  ) AS rn
FROM events
WHERE event_type = 'purchase';

Zona Waktu dan Batas Hari

Berikut pertanyaan tersirat dalam wawancara: pembelian pada pukul 11:30 PM di New York merupakan hari berikutnya dalam UTC. Jika kohort dikelompokkan berdasarkan hari kalender, zona waktu menentukan kohort tempat pengguna tersebut berada.

Jawaban yang aman: simpan stempel waktu dalam UTC, lalu konversikan ke zona waktu bisnis sebelum memotongnya. Nyatakan secara eksplisit zona mana yang menentukan "hari" untuk metrik tersebut, karena satu keputusan ini dapat memindahkan ribuan pengguna ke kohort yang berbeda.

SELECT
  user_id,
  DATE_TRUNC('day',
    MIN(event_at AT TIME ZONE 'America/New_York')
  ) AS cohort_day
FROM events
WHERE event_type = 'purchase'
GROUP BY user_id;

Mengecualikan Pengguna Sebelum Periode Analisis

Analisis nyata membatasi kohort pada rentang tanggal, misalnya "kohort yang dimulai pada kuartal pertama". Saring tanggal tindakan pertama yang sudah diagregasi, yang berarti menggunakan klausa HAVING atau penyaring luar pada CTE, bukan WHERE pada peristiwa mentah.

Menyaring peristiwa mentah berdasarkan tanggal akan secara keliru membiarkan pengguna yang pertama kali membeli pada bulan Desember, tetapi juga beraktivitas pada kuartal pertama, masuk ke kohort kuartal pertama. Selalu lakukan pembatasan berdasarkan tindakan pertama yang telah dihitung.

WITH user_cohort AS (
  SELECT user_id, MIN(event_at) AS first_at
  FROM events WHERE event_type = 'purchase'
  GROUP BY user_id
)
SELECT user_id, DATE_TRUNC('month', first_at) AS cohort_month
FROM user_cohort
WHERE first_at >= DATE '2024-01-01'
  AND first_at <  DATE '2024-04-01';

Pemeriksaan Singkat

Pewawancara bertanya: "Kelompokkan setiap pengguna berdasarkan bulan pembelian pertama mereka. Pengguna mungkin menjelajah sebelum membeli." Pendekatan mana yang benar?

Ringkasan: Menentukan Kohort

Hal-hal penting untuk pertanyaan wawancara tentang penentuan kohort:

  • Kohort mengelompokkan pengguna berdasarkan tindakan pertama yang memenuhi syarat.
  • Hitung dengan MIN(event_at) setelah menyaring peristiwa penentu di WHERE.
  • Kelompokkan ke dalam suatu periode dengan DATE_TRUNC (atau padanan dialeknya).
  • Kemas penetapan tersebut dalam CTE agar dapat digunakan kembali; COUNT(DISTINCT user_id) menghasilkan ukuran kohort.
  • Perhatikan batas hari menurut zona waktu dan batasi rentang tanggal berdasarkan tindakan pertama yang telah dihitung, bukan peristiwa mentah.

Kuasai ini, dan matriks retensi pada pelajaran berikutnya cukup dibuat melalui penggabungan.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Menentukan Kohort berdasarkan Tindakan Pertama” gratis?

Ya — teks lengkap “Menentukan Kohort berdasarkan Tindakan Pertama” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Coding Interview Prep, upgrade ke CoddyKit PRO. Kursus Coding Interview Prep mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Menentukan Kohort berdasarkan Tindakan Pertama”?

Menetapkan setiap pengguna ke kohort berdasarkan tanggal kejadian pertamanya. Kamu berlatih Coding Interview Prep dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Coding Interview Prep?

Tidak diperlukan pengalaman sebelumnya. Coding Interview Prep di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.

Berapa lama pelajaran “Menentukan Kohort berdasarkan Tindakan Pertama” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Coding Interview Prep ini?

Ya. Setiap pelajaran Coding Interview Prep menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Menentukan Kohort berdasarkan Tindakan Pertama
  2. Membangun Matriks Retensi
  3. Retensi Hari ke-N dan Retensi Bergulir
  4. Kueri Churn dan Kembalinya Pengguna
← Kembali ke Coding Interview Prep