Rentetan Aktif Semasa Setakat Hari Ini
Mengira rentetan yang sedang berjalan dan menetapkannya semula apabila terdapat jeda.
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_streakAlternatif: 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_tzdalam Postgres, kemudian tukarkan kepada tarikh. ::dateyang 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_endialah 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.
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
- Mengesan Hari Kalendar Berturutan
- Rentetan Terpanjang bagi Setiap Pengguna
- N Baris Berturutan yang Memenuhi Syarat
- Rentetan Aktif Semasa Setakat Hari Ini