Persediaan Temu Duga Pengaturcaraan · Pelajaran

Pertanyaan Penyisihan dan Pengaktifan Semula

Mengenal pasti pengguna yang berhenti dan pengguna yang kembali selepas suatu tempoh terputus.

Pelajaran 4 daripada 413 langkah

Pertanyaan Penyisihan dan Pengaktifan Semula ialah pelajaran Persediaan Temu Duga Pengaturcaraan percuma di CoddyKit. Ini ialah pelajaran 4 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Persediaan Temu Duga Pengaturcaraan, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Persediaan Temu Duga Pengaturcaraan merangkumi sejumlah 4 pelajaran.

Sisi Lain Pengekalan

Jika pengekalan mengukur siapa yang kekal, kadar berhenti mengukur siapa yang pergi, dan pengaktifan semula mengukur siapa yang kembali. Penemuduga menggabungkan metrik ini dengan pengekalan kerana metrik tersebut menunjukkan sama ada anda boleh menaakul tentang ketiadaan aktiviti, yang lebih sukar daripada mengira kehadiran.

Helah yang berulang ialah: anda tidak boleh menapis baris yang tidak wujud. Pertanyaan kadar berhenti pada asasnya mencari jurang antara aktiviti terakhir pengguna dengan masa kini, atau antara aktiviti terakhir dengan aktiviti seterusnya.

Mentakrifkan Kadar Berhenti dengan Tepat

Istilah "telah berhenti" tidak bermakna tanpa tetingkap masa. Takrifan yang lazim ialah: pengguna telah berhenti jika mereka tidak mempunyai aktiviti dalam 30 hari terakhir. Ambang 30 hari tanpa aktiviti itu ialah pilihan perniagaan yang mesti ditetapkan dengan jelas.

Bagi produk langganan, berhenti mungkin sebaliknya bermaksud langganan yang dibatalkan atau tamat tempoh, iaitu perubahan status dan bukannya jurang aktiviti. Jelaskan model yang terpakai sebelum menulis SQL.

Aktiviti Terakhir bagi Setiap Pengguna

Asas kadar berhenti berdasarkan jurang aktiviti ialah peristiwa paling terkini bagi setiap pengguna. Kumpulkan mengikut pengguna dan ambil MAX tarikh peristiwa.

Nilai tunggal ini, apabila dibandingkan dengan hari ini, memberitahu berapa lama pengguna itu tidak aktif. Semua langkah seterusnya ialah perbandingan dengan tarikh terakhir mereka dilihat.

SELECT
  user_id,
  MAX(event_at::date) AS last_active
FROM events
GROUP BY user_id;

Pertanyaan Pengguna yang Telah Berhenti

Pengguna telah berhenti jika aktiviti terakhir mereka berlaku lebih daripada 30 hari yang lalu. Bandingkan last_active dengan CURRENT_DATE - 30. Sesiapa yang peristiwa terkininya lebih awal daripada titik pemutus itu telah tidak aktif.

Perhatikan bahawa kerja ini berlaku selepas pengagregatan: anda mengecilkan data kepada satu baris bagi setiap pengguna, kemudian menguji jurang tersebut. Menapis peristiwa mentah mengikut tarikh hanya memberitahu anda siapa yang tidak aktif dalam suatu tetingkap, bukannya siapa yang telah berhenti secara keseluruhan.

WITH last_seen AS (
  SELECT user_id, MAX(event_at::date) AS last_active
  FROM events
  GROUP BY user_id
)
SELECT user_id, last_active
FROM last_seen
WHERE last_active < CURRENT_DATE - INTERVAL '30 days';

Mengira Kadar Berhenti

Kadar berhenti ialah bilangan pengguna yang telah berhenti dibahagikan dengan asas yang berkaitan, selalunya pengguna yang aktif pada permulaan tempoh tersebut. Gunakan pengagregatan bersyarat untuk mengira pengguna yang telah berhenti dan jumlah pengguna dalam satu laluan, kemudian lakukan pembahagian dengan teliti menggunakan 100.0 dan NULLIF.

Jelaskan penyebutnya dalam temu duga: kadar berhenti daripada semua pengguna sepanjang masa dan kadar berhenti daripada pengguna yang pernah aktif ialah metrik yang berbeza.

WITH last_seen AS (
  SELECT user_id, MAX(event_at::date) AS last_active
  FROM events GROUP BY user_id
)
SELECT
  COUNT(*) FILTER (
    WHERE last_active < CURRENT_DATE - INTERVAL '30 days'
  ) AS churned,
  COUNT(*) AS total_users,
  ROUND(100.0 * COUNT(*) FILTER (
    WHERE last_active < CURRENT_DATE - INTERVAL '30 days')
    / NULLIF(COUNT(*), 0), 1) AS churn_pct
FROM last_seen;

Kadar Berhenti dari Satu Tempoh ke Tempoh Seterusnya dengan Logik Set

Satu lagi cara melihatnya ialah: siapa yang aktif bulan lalu tetapi tidak bulan ini? Ini ialah perbezaan antara set. Bina set pengguna yang aktif bulan lalu dan set pengguna yang aktif bulan ini, kemudian cari ahli set pertama yang tiada dalam set kedua.

Anda boleh menyatakannya dengan EXCEPT, LEFT JOIN / IS NULL sebagai gabungan anti, atau NOT EXISTS. Gabungan anti ialah cara yang paling serasi dan paling kerap ingin dilihat oleh penemuduga.

WITH last_month AS (
  SELECT DISTINCT user_id FROM events
  WHERE event_at >= DATE '2024-04-01' AND event_at < DATE '2024-05-01'
),
this_month AS (
  SELECT DISTINCT user_id FROM events
  WHERE event_at >= DATE '2024-05-01' AND event_at < DATE '2024-06-01'
)
SELECT user_id FROM last_month
EXCEPT
SELECT user_id FROM this_month;

Bentuk Gabungan Anti

Pertanyaan pengguna yang berhenti aktif dalam tempoh ini yang sama, tetapi menggunakan gabungan anti: gunakan LEFT JOIN untuk menggabungkan pengguna aktif bulan ini dengan pengguna bulan lalu, kemudian kekalkan baris yang padanannya ialah NULL. Ini ialah pengguna yang hadir bulan lalu tetapi tiada bulan ini, iaitu pengguna yang berhenti aktif.

NOT EXISTS juga merupakan jawapan yang sama baik dan mengendalikan NULL dengan selamat. Nyatakan bahawa NOT IN boleh berisiko jika set dalamannya mengandungi NULL, iaitu perangkap klasik.

SELECT lm.user_id
FROM last_month lm
LEFT JOIN this_month tm ON tm.user_id = lm.user_id
WHERE tm.user_id IS NULL;

Mentakrifkan Pengaktifan Semula

Pengaktifan semula ialah pengguna yang telah berhenti aktif kemudian kembali aktif. Tandanya ialah jurang dalam garis masa mereka: aktif, kemudian senyap lebih lama daripada ambang berhenti aktif, lalu aktif semula.

Jadi, pengguna yang diaktifkan semula bulan ini ialah pengguna yang kini aktif, tidak aktif dalam tempoh sebelumnya, tetapi mempunyai aktiviti dalam tempoh yang lebih awal. Ini merupakan imej cermin bagi pengguna yang berhenti aktif.

Mengesan Jurang Dengan LAG

Cara yang elegan untuk mencari pengaktifan semula ialah fungsi tetingkap LAG: bagi setiap tempoh aktiviti setiap pengguna, lihat tempoh aktif sebelumnya. Jika jurang antaranya melebihi ambang, tempoh ini ialah pengaktifan semula.

LAG mengelakkan gabungan kendiri dan mudah dibaca. Bahagikan mengikut pengguna, susun mengikut tempoh aktif, kemudian bandingkan setiap tempoh dengan tempoh sebelumnya.

WITH monthly AS (
  SELECT DISTINCT user_id,
    DATE_TRUNC('month', event_at) AS active_month
  FROM events
),
gaps AS (
  SELECT user_id, active_month,
    LAG(active_month) OVER (
      PARTITION BY user_id ORDER BY active_month
    ) AS prev_month
  FROM monthly
)
SELECT user_id, active_month AS resurrected_month
FROM gaps
WHERE prev_month IS NOT NULL
  AND active_month > prev_month + INTERVAL '1 month';

Baharu vs Diaktifkan Semula vs Dikekalkan

Pertanyaan pengelasan aktiviti yang lengkap melabelkan setiap pengguna yang aktif dalam tempoh ini sebagai salah satu daripada: baharu (tiada aktiviti terdahulu), dikekalkan (juga aktif dalam tempoh sebelumnya), atau diaktifkan semula (mempunyai aktiviti terdahulu tetapi terdapat jurang). Nilai prev_month daripada LAG memacu ketiga-tiganya.

  • prev_month IS NULL → baharu
  • prev_month = active_month - 1 → dikekalkan
  • selain itu (terdapat jurang) → diaktifkan semula

Menghasilkan pecahan ini merupakan jawapan yang kukuh dan lengkap.

SELECT user_id, active_month,
  CASE
    WHEN prev_month IS NULL THEN 'new'
    WHEN active_month = prev_month + INTERVAL '1 month' THEN 'retained'
    ELSE 'resurrected'
  END AS user_state
FROM gaps;

Perangkap NULL Dalam NOT IN

Inilah perangkap terakhir. Jika Anda menulis penghentian aktif sebagai WHERE user_id NOT IN (SELECT user_id FROM this_month) dan subpertanyaan itu mengembalikan walaupun satu NULL, keseluruhan hasil menjadi kosong kerana NOT IN dinilai sebagai UNKNOWN terhadap NULL.

Gunakan NOT EXISTS atau gabungan anti LEFT JOIN / IS NULL, yang berfungsi dengan betul bersama NULL. Menyebut perbezaan ini tanpa diminta merupakan petunjuk kukuh bahawa Anda berpengalaman dalam temu duga pengekalan pengguna.

-- safe anti-join instead of NOT IN
SELECT lm.user_id
FROM last_month lm
WHERE NOT EXISTS (
  SELECT 1 FROM this_month tm
  WHERE tm.user_id = lm.user_id
);

Semakan Pantas

Anda mahu mencari pengguna yang aktif bulan lalu tetapi tidak aktif bulan ini. Seorang rakan sepasukan menulis WHERE user_id NOT IN (SELECT user_id FROM this_month), tetapi pertanyaan itu mengembalikan sifar baris walaupun jelas terdapat pengguna yang berhenti aktif. Apakah pembaikan yang paling selamat?

Ringkasan: Penghentian Aktif dan Pengaktifan Semula

Perkara penting tentang penghentian aktif dan pengaktifan semula:

  • Takrifkan penghentian aktif menggunakan ambang tidak aktif (contohnya, tiada aktiviti selama 30 hari) atau perubahan status langganan — jelaskan yang mana satu digunakan.
  • Kira MAX(last activity) setiap pengguna, kemudian bandingkan dengan CURRENT_DATE - threshold.
  • Penghentian aktif dari satu tempoh ke tempoh berikutnya ialah perbezaan set: gunakan EXCEPT, NOT EXISTS, atau gabungan anti LEFT JOIN / IS NULL.
  • Pengaktifan semula ialah jurang dalam garis masa; kesan dengan LAG untuk mengelaskan pengguna sebagai baharu / dikekalkan / diaktifkan semula.
  • Elakkan NOT IN apabila NULL mungkin wujud — ia mengosongkan hasil secara senyap.
Percuma untuk bermula

Pelajari Persediaan Temu Duga Pengaturcaraan dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
90
Pelajaran
360

Soalan Lazim

Adakah pelajaran “Pertanyaan Penyisihan dan Pengaktifan Semula” percuma?

Ya — teks penuh “Pertanyaan Penyisihan dan Pengaktifan Semula” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Persediaan Temu Duga Pengaturcaraan, tingkat taraf kepada CoddyKit PRO. Kursus Persediaan Temu Duga Pengaturcaraan merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Pertanyaan Penyisihan dan Pengaktifan Semula”?

Mengenal pasti pengguna yang berhenti dan pengguna yang kembali selepas suatu tempoh terputus. Anda berlatih Persediaan Temu Duga Pengaturcaraan menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Persediaan Temu Duga Pengaturcaraan?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Persediaan Temu Duga Pengaturcaraan di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 4 daripada 4.

Berapa lamakah pelajaran “Pertanyaan Penyisihan dan Pengaktifan Semula” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Persediaan Temu Duga Pengaturcaraan ini?

Ya. Setiap pelajaran Persediaan Temu Duga Pengaturcaraan menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Menentukan Kohort Mengikut Tindakan Pertama
  2. Membina Matriks Pengekalan
  3. Pengekalan Hari-N dan Bergulir
  4. Pertanyaan Penyisihan dan Pengaktifan Semula
← Kembali ke Persediaan Temu Duga Pengaturcaraan