Persediaan Temu Duga SQL · Pelajaran

Rentetan Aktif Semasa Setakat Hari Ini

Mengira rentetan yang sedang berjalan dan menetapkannya semula apabila terdapat jeda.

Pelajaran 4 daripada 413 langkah

Rentetan Aktif Semasa Setakat Hari Ini ialah pelajaran Persediaan Temu Duga SQL 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 SQL, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Persediaan Temu Duga SQL merangkumi sejumlah 4 pelajaran.

Soalan Produk

Ciri rentetan (fikirkan Duolingo atau Snapchat) memerlukan rentetan semasa, bukannya rentetan terpanjang dalam sejarah. Soalan temu duga: "Bagi setiap pengguna, berapa hari berturutan yang berakhir hari ini mereka telah aktif? Tetapkan semula kepada 0 jika mereka tidak aktif hari ini."

Ini menambahkan satu kelainan: rentetan mesti berpaksikan hari ini (atau semalam di bawah peraturan kelonggaran). Mari bina rentetan ini berasaskan asas jurang-dan-kelompok yang telah anda ketahui.

Mentakrifkan Keaktifan

Mula-mula jelaskan peraturan dengan penemuduga anda — keputusan ini mengubah kueri:

  • Adakah rentetan memerlukan aktiviti hari ini, atau adakah semalam boleh diterima (tempoh kelonggaran)?
  • Adakah beberapa peristiwa sehari digabungkan menjadi satu hari?
  • Zon waktu manakah yang mentakrifkan "hari"?

Kita akan menganggap terdapat satu baris bagi setiap hari aktif dan rentetan dianggap semasa jika ia merangkumi hari ini OR semalam.

Bina Semula Kelompok

Gunakan semula penambat: nomborkan hari setiap pengguna mengikut tarikh dan lakukan penolakan. Setiap rentetan berturutan berkongsi satu penambat. Rentetan semasa hanyalah kelompok yang hari terakhirnya ialah hari ini atau semalam.

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;

Kenal Pasti Kelompok Terkini

Kelompok terbaharu setiap pengguna ialah kelompok dengan streak_end yang paling besar. Kita menguji sama ada tarikh tamat itu cukup terkini untuk dikira sebagai masih berterusan.

CURRENT_DATE memberikan hari ini. CURRENT_DATE - 1 ialah semalam. Jika streak_end bersamaan dengan salah satu daripadanya, rentetan itu 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;

Gunakan Ujian Kekinian

Sekarang tentukan sama ada kelompok terkini masih aktif. Jika tarikh tamatnya ialah hari ini atau semalam, rentetan semasa bersamaan dengan panjangnya; jika tidak, pengguna telah memutuskan rentetannya dan nilai semasa ialah 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 Semasa

Gabungkan semua lapisan: nomborkan, bina kelompok, pilih kelompok terkini bagi setiap pengguna, kemudian gunakan CASE kekinian. Inilah jawapan 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;

Ketegasan Hari Ini Sahaja

Jika peraturan perniagaan adalah ketat — rentetan hanya aktif jika pengguna aktif hari ini — ubah perbandingan supaya memerlukan streak_end = CURRENT_DATE.

Versi tempoh kelonggaran (>= CURRENT_DATE - 1) lebih mesra dan biasa digunakan dalam aplikasi sebenar, kerana hari masih belum berakhir. Sentiasa sahkan perkara yang dikehendaki oleh penemuduga.

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

Alternatif: Jejaki ke Belakang

Satu lagi model pemikiran yang lebih disukai oleh sesetengah penemuduga: kira jarak dari setiap hari ke hari ini. Sesuatu hari termasuk dalam rentetan semasa hanya jika setiap hari dari hari tersebut hingga hari ini wujud. Secara setara, bandingkan login_date dengan CURRENT_DATE - (offset from the latest).

Kaedah kelompok biasanya lebih kemas, tetapi mengetahui alternatif menunjukkan pemahaman yang mendalam. Idea utamanya sama: satu rantaian yang tidak terputus dan berpaksikan hari ini.

Memasukkan Pengguna Tidak Aktif

Pengguna yang tiada dalam logins tidak mempunyai kelompok dan akan hilang. Jika setiap pengguna mesti melaporkan rentetan (kemungkinan besar 0), gunakan LEFT JOIN pada senarai pengguna dan COALESCE hasilnya kepada 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;

Perangkap Zon Waktu

Jika aktiviti disimpan sebagai cap masa, "hari ini" bergantung pada zon waktu. Tukarkannya sebelum memotong kepada tarikh.

  • Simpan dan bandingkan dalam UTC, atau tukar kepada zon setempat pengguna terlebih dahulu.
  • Gunakan event_ts AT TIME ZONE 'UTC' AT TIME ZONE user_tz dalam Postgres, kemudian tukarkan kepada tarikh.
  • ::date yang digunakan secara naif pada cap masa UTC boleh meletakkan peristiwa waktu petang pada hari kalendar yang salah.

Menyebut perkara ini lebih awal dapat mengelakkan soalan susulan tentang perangkap klasik.

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

Prestasi dan Penutup

Bagi papan pemuka yang kerap dimuat semula, kueri ini berjalan untuk setiap pengguna dalam satu laluan. Untuk mengekalkan kelancaran:

  • Indekskan (user_id, login_date).
  • Hadkan input kepada tarikh terkini secara pilihan — rentetan semasa tidak boleh merangkumi data yang lebih lama daripada panjangnya sendiri, jadi tetingkap bergerak, katakan 400 hari terakhir, sudah memadai.
  • Wujudkan data harian secara terwujud dalam jadual rentetan jika ia dibaca dengan sangat kerap.

Semakan Pantas

Sahkan bahawa anda memahami penambat kepada "sekarang."

Ringkasan

Untuk mengira rentetan aktif semasa pada hari ini:

  • Bina kelompok berturutan dengan penambat login_date - ROW_NUMBER().
  • Pilih kelompok terkini setiap pengguna berdasarkan nilai maksimum streak_end.
  • Kembalikan panjangnya hanya jika streak_end ialah hari ini (atau semalam untuk tempoh kelonggaran), jika tidak, kembalikan 0.
  • Gunakan LEFT JOIN pada users untuk akaun tidak aktif; kendalikan zon waktu sebelum memotong kepada tarikh.

Kini anda menguasai keseluruhan kit alat analisis rentetan: mengesan rentetan, rentetan terpanjang, syarat N berturutan, dan rentetan aktif.

Percuma untuk bermula

Pelajari SQL 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
30
Pelajaran
120

Soalan Lazim

Adakah pelajaran “Rentetan Aktif Semasa Setakat Hari Ini” percuma?

Ya — teks penuh “Rentetan Aktif Semasa Setakat Hari Ini” 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 SQL, tingkat taraf kepada CoddyKit PRO. Kursus Persediaan Temu Duga SQL merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Rentetan Aktif Semasa Setakat Hari Ini”?

Mengira rentetan yang sedang berjalan dan menetapkannya semula apabila terdapat jeda. Anda berlatih Persediaan Temu Duga SQL 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 SQL?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Persediaan Temu Duga SQL 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 “Rentetan Aktif Semasa Setakat Hari Ini” 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 SQL ini?

Ya. Setiap pelajaran Persediaan Temu Duga SQL 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. Mengesan Hari Kalendar Berturutan
  2. Rentetan Terpanjang bagi Setiap Pengguna
  3. N Baris Berturutan yang Memenuhi Syarat
  4. Rentetan Aktif Semasa Setakat Hari Ini
← Kembali ke Persediaan Temu Duga SQL