Kejadian Berurutan dan Jendela Waktu
Memastikan langkah berlangsung berurutan dan dalam batas waktu menggunakan fungsi jendela.
Kejadian Berurutan dan Jendela Waktu adalah pelajaran Coding Interview Prep gratis di CoddyKit. Ini adalah pelajaran 2 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 Urutan dan Waktu Penting
Corong dasar dari pelajaran sebelumnya hanya memeriksa apakah seorang pengguna melakukan setiap langkah. Pewawancara yang lebih teliti akan bertanya: apakah langkah-langkah tersebut terjadi dalam urutan yang tepat dan dalam waktu yang wajar?
Pengguna yang melakukan pembelian pada hari Senin dan mengunjungi halaman pemasaran pada hari Jumat tidak mengalami konversi melalui corong Anda. Urutan dan waktu mengubah corong naif berbasis penanda menjadi corong yang dapat dipercaya.
Gagasan Stempel Waktu Pertama per Pengguna
Untuk memahami urutan, catat waktu pertama setiap pengguna pada setiap langkah. Kunjungan pertama, pendaftaran pertama, pembelian pertama.
Konversi yang rapi berarti first_signup_time >= first_visit_time dan seterusnya hingga akhir rangkaian. MIN(event_time) yang dikelompokkan berdasarkan langkah memberikan patokan tersebut.
SELECT
user_id,
MIN(CASE WHEN event_name = 'visit' THEN event_time END) AS first_visit,
MIN(CASE WHEN event_name = 'signup' THEN event_time END) AS first_signup,
MIN(CASE WHEN event_name = 'purchase' THEN event_time END) AS first_purchase
FROM events
GROUP BY user_id;Mensyaratkan Langkah-Langkah Berurutan
Dengan stempel waktu pertama untuk setiap langkah, memastikan urutan menjadi masalah perbandingan. Seorang pengguna benar-benar berkonversi ke langkah 3 hanya jika setiap stempel waktu tidak NULL dan meningkat secara monoton.
Perhatikan bahwa stempel waktu NULL (langkah tersebut tidak pernah terjadi) secara alami gagal dalam perbandingan, persis seperti yang Anda inginkan.
WITH t AS (
SELECT user_id,
MIN(CASE WHEN event_name='visit' THEN event_time END) AS visit_t,
MIN(CASE WHEN event_name='signup' THEN event_time END) AS signup_t,
MIN(CASE WHEN event_name='purchase' THEN event_time END) AS purchase_t
FROM events GROUP BY user_id
)
SELECT COUNT(*) AS converted_in_order
FROM t
WHERE visit_t IS NOT NULL
AND signup_t >= visit_t
AND purchase_t >= signup_t;Menambahkan Jendela Waktu
Sebagian besar corong memiliki batas waktu: "berkonversi dalam 7 hari sejak kunjungan pertama." Tambahkan batas interval antara langkah pertama dan langkah terakhir.
Operasi tanggal berbeda-beda menurut dialek. Dalam Postgres, Anda dapat menulis visit_t + INTERVAL '7 days'; dalam MySQL, gunakan DATE_ADD(visit_t, INTERVAL 7 DAY). Selalu nyatakan dialek yang Anda gunakan.
WITH t AS (
SELECT user_id,
MIN(CASE WHEN event_name='visit' THEN event_time END) AS visit_t,
MIN(CASE WHEN event_name='purchase' THEN event_time END) AS purchase_t
FROM events GROUP BY user_id
)
SELECT COUNT(*) AS purchased_within_7d
FROM t
WHERE purchase_t >= visit_t
AND purchase_t < visit_t + INTERVAL '7 days';Mengapa Menggunakan Stempel Waktu Pertama, Bukan Sembarang Stempel Waktu
Ada poin wawancara yang cukup halus: haruskah jendela dihitung dari kunjungan pertama pengguna atau kunjungan terbaru sebelum pendaftaran? Hal ini bergantung pada pertanyaan produk.
- Jendela interaksi pertama mengukur waktu dari minat awal hingga konversi.
- Jendela interaksi terakhir mengukur waktu konversi setelah kunjungan terakhir.
Tanyakan kepada pewawancara maksud yang mereka inginkan; memilihnya secara sengaja menunjukkan pengalaman yang matang.
Peristiwa Berurutan dengan LEAD
Untuk jalur kompleks yang terdiri dari beberapa langkah, fungsi jendela sangat berguna. Urutkan peristiwa setiap pengguna berdasarkan waktu, lalu gunakan LEAD untuk melihat peristiwa berikutnya dan memastikan bahwa peristiwa tersebut merupakan langkah berikutnya yang diharapkan.
Ini menangani jalur yang langkah-langkahnya berselang-seling dengan peristiwa lain yang tidak terkait.
SELECT
user_id,
event_name,
event_time,
LEAD(event_name) OVER (PARTITION BY user_id ORDER BY event_time) AS next_event,
LEAD(event_time) OVER (PARTITION BY user_id ORDER BY event_time) AS next_time
FROM events;Mencocokkan Langkah Berikutnya yang Diharapkan
Kembangkan penggunaan LEAD: pertahankan baris ketika 'kunjungan' langsung diikuti oleh 'pendaftaran'. Dengan demikian, Anda menemukan transisi berurutan yang sebenarnya, bukan sekadar kemunculan bersama.
Anda dapat merangkai pemeriksaan transisi ini untuk memvalidasi seluruh jalur berurutan langkah demi langkah.
WITH seq AS (
SELECT user_id, event_name, event_time,
LEAD(event_name) OVER (PARTITION BY user_id ORDER BY event_time) AS next_event
FROM events
)
SELECT COUNT(DISTINCT user_id) AS visit_then_signup
FROM seq
WHERE event_name = 'visit' AND next_event = 'signup';Waktu antara Langkah-Langkah Berturutan
Pewawancara suka bertanya, "berapa lama waktu yang diperlukan setiap langkah?" Gunakan LEAD pada stempel waktu, lalu kurangkan. Perbedaan antara peristiwa yang berurutan merupakan durasi pada tahap tersebut.
Agregasikan median atau rata-rata untuk setiap transisi guna menemukan tahap corong yang paling lambat.
WITH seq AS (
SELECT user_id, event_name, event_time,
LEAD(event_time) OVER (PARTITION BY user_id ORDER BY event_time) AS next_time
FROM events
)
SELECT
event_name,
AVG(EXTRACT(EPOCH FROM (next_time - event_time)) / 3600.0) AS avg_hours_to_next
FROM seq
WHERE next_time IS NOT NULL
GROUP BY event_name;Kasus Tepi dengan Stempel Waktu Sama
Bagaimana jika dua peristiwa memiliki event_time yang sama persis? Dalam kasus itu, signup_t >= visit_t bernilai benar meskipun keduanya terjadi bersamaan, sehingga pengurutan hanya berdasarkan waktu menjadi ambigu.
- Gunakan
>=atau>secara sengaja dan jelaskan alasannya. - Tambahkan pemecah seri, seperti id urutan peristiwa, ke
ORDER BYagar fungsi jendela bersifat deterministik.
Menyebutkan hal ini tanpa diminta akan mengesankan pewawancara.
SELECT user_id, event_name,
ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY event_time, event_id) AS step_seq
FROM events;Menggabungkan Urutan dan Jendela dalam Satu Kueri
Inilah corong lengkap yang berurutan dan berada dalam jendela waktu. Corong ini berpatokan pada kunjungan pertama, mengharuskan kemunculan pertama setiap langkah berikutnya terjadi setelah langkah sebelumnya, dan membatasi seluruh jalur hingga 7 hari.
Inilah jawaban yang membedakan calon yang memahami corong dari calon yang hanya menghitung penanda.
WITH t AS (
SELECT user_id,
MIN(CASE WHEN event_name='visit' THEN event_time END) AS v,
MIN(CASE WHEN event_name='signup' THEN event_time END) AS s,
MIN(CASE WHEN event_name='purchase' THEN event_time END) AS p
FROM events GROUP BY user_id
)
SELECT
COUNT(*) FILTER (WHERE v IS NOT NULL) AS visited,
COUNT(*) FILTER (WHERE s >= v AND s < v + INTERVAL '7 days') AS signed_up,
COUNT(*) FILTER (WHERE s >= v AND p >= s AND p < v + INTERVAL '7 days') AS purchased
FROM t;Catatan Lintas Dialek
Dua pengingat tentang portabilitas saat menulis kode langsung:
FILTER (WHERE ...)pada agregat merupakan SQL standar dan berfungsi di Postgres; dalam MySQL atau mesin versi lama, gunakan alternatifSUM(CASE WHEN ... THEN 1 ELSE 0 END).- Sintaks interval berbeda-beda: Postgres
+ INTERVAL '7 days', MySQLDATE_ADD(d, INTERVAL 7 DAY), SQL ServerDATEADD(day, 7, d).
Nyatakan asumsi Anda, dan pewawancara biasanya tidak mempermasalahkan dialek yang dipilih, asalkan Anda mengetahui bahwa dialek-dialek tersebut berbeda.
Pemeriksaan Singkat
Anda harus menghitung pengguna yang menyelesaikan kunjungan -> pendaftaran -> pembelian secara berurutan, dalam 7 hari sejak kunjungan pertama. Pendekatan mana yang benar?
Rangkuman: Peristiwa Berurutan dan Jendela Waktu
Hal-hal penting:
- Catat stempel waktu pertama untuk setiap langkah setiap pengguna dengan
MIN(CASE ...). - Tegakkan urutan dengan mensyaratkan waktu setiap langkah berada pada atau setelah waktu langkah sebelumnya.
- Batasi jalur dengan rentang waktu, dan nyatakan sintaksis dialek Anda.
- Gunakan
LEAD/LAGuntuk pemeriksaan transisi dan waktu tunggu antar langkah. - Tangani seri pada stempel waktu yang sama dengan pemecah seri di
ORDER BY.
Berikutnya: beralih dari corong ke eksperimen dan menghitung metrik per varian.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Kejadian Berurutan dan Jendela Waktu” gratis?
Ya — teks lengkap “Kejadian Berurutan dan Jendela Waktu” 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 “Kejadian Berurutan dan Jendela Waktu”?
Memastikan langkah berlangsung berurutan dan dalam batas waktu menggunakan fungsi jendela. 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 2 dari 4.
Berapa lama pelajaran “Kejadian Berurutan dan Jendela Waktu” 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
- Membangun Corong Multi-Langkah
- Kejadian Berurutan dan Jendela Waktu
- Penetapan Uji A/B dan Metrik
- Peningkatan, Signifikansi, dan Pengaman dalam SQL