0Pricing
SQL Interview Prep · Pelajaran

Rangkaian Aktif Saat Ini hingga Hari Ini

Menghitung rangkaian yang sedang berlangsung dan meresetnya saat terputus.

Rangkaian Aktif Saat Ini hingga Hari Ini adalah pelajaran SQL Interview Prep gratis di CoddyKit. Ini adalah pelajaran 4 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 SQL Interview Prep, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus SQL Interview Prep mencakup 4 pelajaran total.

Pertanyaan Produk

Fitur rentetan (misalnya Duolingo atau Snapchat) memerlukan rentetan saat ini, bukan rentetan historis terpanjang. Pertanyaan wawancaranya: "Untuk setiap pengguna, berapa banyak hari berurutan yang berakhir hari ini dan selama itu mereka aktif? Atur ulang menjadi 0 jika mereka tidak aktif hari ini."

Hal ini menambahkan satu keunikan: rentetan harus berjangkar pada hari ini (atau kemarin berdasarkan aturan masa tenggang). Mari kita membangunnya berdasarkan dasar metode celah-dan-pulau yang sudah Anda kenal.

Mendefinisikan Keaktifan

Pertama, perjelas aturannya bersama pewawancara — keputusan ini mengubah kueri:

  • Apakah rentetan harus memerlukan aktivitas hari ini, atau apakah kemarin dapat diterima (masa tenggang)?
  • Apakah beberapa peristiwa dalam satu hari digabung menjadi satu hari?
  • Zona waktu apa yang menentukan suatu "hari"?

Kita akan mengasumsikan satu baris untuk setiap hari aktif dan rentetan dianggap masih berlangsung jika mencakup hari ini OR kemarin.

Membangun Kembali Pulau

Gunakan kembali jangkar: beri nomor pada hari setiap pengguna berdasarkan tanggal, lalu kurangkan. Setiap rangkaian berurutan memiliki jangkar yang sama. Rentetan saat ini hanyalah pulau yang hari terakhirnya adalah hari ini atau kemarin.

WITH numbered AS (
  SELECT user_id, login_date,
    ROW_NUMBER() OVER (
      PARTITION BY user_id ORDER BY login_date
    ) AS rn
  FROM logins
),
islands AS (
  SELECT user_id,
    MIN(login_date) AS streak_start,
    MAX(login_date) AS streak_end,
    COUNT(*)        AS streak_len
  FROM numbered
  GROUP BY user_id, login_date - rn
)
SELECT * FROM islands;

Mengidentifikasi Pulau Terbaru

Pulau terbaru setiap pengguna adalah pulau dengan streak_end terbesar. Kita memeriksa apakah tanggal akhirnya cukup baru untuk dihitung sebagai rentetan yang masih berlangsung.

CURRENT_DATE memberikan tanggal hari ini. CURRENT_DATE - 1 adalah tanggal kemarin. Jika streak_end sama dengan salah satunya, rentetan tersebut masih aktif.

WITH /* ...numbered, islands... */
latest AS (
  SELECT *,
    ROW_NUMBER() OVER (
      PARTITION BY user_id ORDER BY streak_end DESC
    ) AS rn2
  FROM islands
)
SELECT * FROM latest WHERE rn2 = 1;

Menerapkan Pengujian Keterkinian

Sekarang tentukan apakah pulau terbaru masih aktif. Jika tanggal akhirnya adalah hari ini atau kemarin, rentetan saat ini sama dengan panjang pulau tersebut; jika tidak, rentetan pengguna telah terputus dan nilainya saat ini adalah 0.

SELECT user_id,
  CASE
    WHEN streak_end >= CURRENT_DATE - 1
    THEN streak_len
    ELSE 0
  END AS current_streak
FROM latest
WHERE rn2 = 1;

Kueri Lengkap Rentetan Saat Ini

Satukan semua lapisan: beri nomor, bangun pulau, pilih pulau terbaru setiap pengguna, lalu terapkan CASE keterkinian. Inilah jawaban lengkapnya.

WITH numbered AS (
  SELECT user_id, login_date,
    ROW_NUMBER() OVER (
      PARTITION BY user_id ORDER BY login_date
    ) AS rn
  FROM logins
),
islands AS (
  SELECT user_id,
    MAX(login_date) AS streak_end,
    COUNT(*)        AS streak_len
  FROM numbered
  GROUP BY user_id, login_date - rn
),
latest AS (
  SELECT *,
    ROW_NUMBER() OVER (
      PARTITION BY user_id ORDER BY streak_end DESC
    ) AS rn2
  FROM islands
)
SELECT user_id,
  CASE WHEN streak_end >= CURRENT_DATE - 1
       THEN streak_len ELSE 0 END AS current_streak
FROM latest
WHERE rn2 = 1
ORDER BY user_id;

Ketentuan Hanya Hari Ini

Jika aturan bisnisnya ketat — rentetan hanya tetap aktif jika pengguna aktif hari ini — ubah perbandingannya sehingga memerlukan streak_end = CURRENT_DATE.

Versi masa tenggang (>= CURRENT_DATE - 1) lebih ramah dan umum digunakan dalam aplikasi nyata, karena hari tersebut belum berakhir. Selalu pastikan versi mana yang diinginkan pewawancara.

CASE WHEN streak_end = CURRENT_DATE
     THEN streak_len ELSE 0 END AS current_streak

Alternatif: Menelusuri Mundur

Model pemikiran lain yang disukai sebagian pewawancara: hitung jarak dari setiap hari ke hari ini. Suatu hari termasuk dalam rentetan saat ini hanya jika setiap hari sejak hari tersebut hingga hari ini tersedia. Dengan kata lain, bandingkan login_date dengan CURRENT_DATE - (offset from the latest).

Metode pulau biasanya lebih bersih, tetapi mengetahui alternatif menunjukkan pemahaman yang mendalam. Gagasan utamanya sama: rantai tanpa putus yang berjangkar pada hari ini.

Menyertakan Pengguna Tidak Aktif

Pengguna yang tidak ada di logins tidak memiliki pulau dan menghilang. Jika setiap pengguna harus melaporkan rentetan (kemungkinan besar 0), gunakan LEFT JOIN pada daftar pengguna dan COALESCE hasilnya menjadi 0.

SELECT u.user_id,
  COALESCE(s.current_streak, 0) AS current_streak
FROM users u
LEFT JOIN current_streaks s ON s.user_id = u.user_id;

Jebakan Zona Waktu

Jika aktivitas disimpan sebagai cap waktu, "hari ini" bergantung pada zona waktu. Konversikan sebelum memotongnya menjadi tanggal.

  • Simpan dan bandingkan dalam UTC, atau konversikan terlebih dahulu ke zona lokal pengguna.
  • Gunakan event_ts AT TIME ZONE 'UTC' AT TIME ZONE user_tz di Postgres, lalu ubah tipenya menjadi tanggal.
  • ::date yang diterapkan secara naif pada cap waktu UTC dapat menempatkan peristiwa malam hari pada hari kalender yang salah.

Menyebutkan hal ini akan mengantisipasi pertanyaan lanjutan tentang jebakan klasik.

SELECT user_id,
  (event_ts AT TIME ZONE 'UTC'
             AT TIME ZONE 'America/New_York')::date AS local_day
FROM events;

Kinerja dan Penutup

Untuk dasbor yang sering diperbarui, kueri ini berjalan per pengguna dalam satu lintasan. Agar tetap cepat:

  • Buat indeks pada (user_id, login_date).
  • Secara opsional, batasi masukan pada tanggal-tanggal terbaru — rentetan saat ini tidak mungkin mencakup data yang lebih lama daripada panjangnya sendiri, sehingga jendela bergulir, misalnya 400 hari terakhir, sudah lebih dari cukup.
  • Wujudkan data harian ke dalam tabel rentetan jika sangat sering dibaca.

Pemeriksaan Singkat

Pastikan Anda memahami jangkar terhadap "sekarang."

Ringkasan

Untuk menghitung rentetan aktif saat ini hingga hari ini:

  • Bentuk pulau dengan jangkar login_date - ROW_NUMBER().
  • Pilih pulau terbaru setiap pengguna berdasarkan nilai maksimum streak_end.
  • Kembalikan panjangnya hanya jika streak_end adalah hari ini (atau kemarin untuk masa tenggang), selain itu kembalikan 0.
  • Gunakan LEFT JOIN pada users untuk akun yang tidak aktif; tangani zona waktu sebelum memotong nilai menjadi tanggal.

Sekarang Anda telah menguasai seluruh perangkat analisis rentetan: mendeteksi rangkaian, rentetan terpanjang, kondisi N baris berurutan, dan rentetan yang sedang berlangsung.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Rangkaian Aktif Saat Ini hingga Hari Ini” gratis?

Ya — teks lengkap “Rangkaian Aktif Saat Ini hingga Hari Ini” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus SQL Interview Prep, upgrade ke CoddyKit PRO. Kursus SQL Interview Prep mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Rangkaian Aktif Saat Ini hingga Hari Ini”?

Menghitung rangkaian yang sedang berlangsung dan meresetnya saat terputus. Kamu berlatih SQL 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 SQL Interview Prep?

Tidak diperlukan pengalaman sebelumnya. SQL 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 4 dari 4.

Berapa lama pelajaran “Rangkaian Aktif Saat Ini hingga Hari Ini” 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 SQL Interview Prep ini?

Ya. Setiap pelajaran SQL 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. Mendeteksi Hari Kalender yang Berurutan
  2. Rangkaian Terpanjang per Pengguna
  3. N Baris Berturut-turut yang Memenuhi Kondisi
  4. Rangkaian Aktif Saat Ini hingga Hari Ini
← Kembali ke SQL Interview Prep