Persediaan Temu Duga Pengaturcaraan · Pelajaran

Set Soalan Temu Duga Olok-olok Lengkap

Soalan menyeluruh berjangka masa yang menggabungkan cantuman, tetingkap dan CTE dalam keadaan temu duga.

Pelajaran 4 daripada 413 langkah

Set Soalan Temu Duga Olok-olok Lengkap 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.

Aliran Sesi Temu Duga SQL

Bab penutup ini membawa anda melalui masalah simulasi penuh yang menggabungkan cantuman, fungsi tetingkap dan CTE dalam keadaan temu duga. Pertama sekali, kemahiran meta: cara anda perlu berkelakuan dalam sesi tersebut.

  • Nyatakan semula masalah dan sahkan skema.
  • Jelaskan kes tepi (NULL, seri, pendua) sebelum menulis kod.
  • Huraikan pendekatan anda, kemudian tulis pertanyaan.
  • Uji pertanyaan terhadap sampel kecil secara mental.

Penemu duga menilai proses anda sama seperti pertanyaan akhir anda.

Skema Dikongsi

Semua masalah di bawah menggunakan skema e-dagang kecil ini. Baca sekali supaya setiap pertanyaan dapat difahami.

  • customers(id, name, country)
  • orders(id, customer_id, order_date, status, amount)
  • order_items(order_id, product_id, quantity)
  • products(id, name, category, price)

Ingat skema ini; seluruh pelajaran seterusnya merujuk jadual-jadual tersebut.

-- orders.status is one of: 'paid','pending','cancelled'
-- amount is the order total in the customer's currency

Masalah 1: Pelanggan Teratas mengikut Perbelanjaan

"Kembalikan 3 pelanggan teratas mengikut jumlah perbelanjaan yang dibayar, bersama nama dan jumlah mereka."

Pendekatan: tapis kepada pesanan yang telah dibayar, jumlahkan mengikut pelanggan, susun hasil dan hadkan bilangan hasil. Nyatakan bahawa anda mengecualikan pesanan yang dibatalkan dan belum selesai, iaitu kes tepi yang sengaja dimasukkan oleh penemu duga.

SELECT c.name,
       SUM(o.amount) AS total_spend
FROM customers c
JOIN orders o ON o.customer_id = c.id
WHERE o.status = 'paid'
GROUP BY c.id, c.name
ORDER BY total_spend DESC
LIMIT 3;

Masalah 2: Pelanggan yang Tidak Pernah Membuat Pesanan

"Senaraikan pelanggan yang tidak pernah membuat pesanan." Ini ialah corak anti-cantuman. Dua penyelesaian yang jelas: LEFT JOIN dengan IS NULL, atau NOT EXISTS.

Utamakan NOT EXISTS kerana ia selamat terhadap NULL (tidak seperti NOT IN). Nyatakan perbezaan itu; itulah perkara yang ingin diuji oleh penemu duga.

-- NULL-safe anti-join
SELECT c.id, c.name
FROM customers c
WHERE NOT EXISTS (
  SELECT 1
  FROM orders o
  WHERE o.customer_id = c.id
);

Masalah 3: Amaun Pesanan Kedua Tertinggi

"Cari amaun pesanan berbeza yang kedua tertinggi." Penyelesaian paling kemas dan tahan terhadap seri menggunakan DENSE_RANK supaya amaun pendua berkongsi kedudukan.

Kes tepi yang perlu dinyatakan: jika tiada nilai berbeza kedua, tiada baris dikembalikan. Keadaan ini mungkin boleh diterima atau mungkin memerlukan pembungkus COALESCE, bergantung pada keperluan.

SELECT amount
FROM (
  SELECT amount,
         DENSE_RANK() OVER (ORDER BY amount DESC) AS rnk
  FROM orders
) ranked
WHERE rnk = 2;

Masalah 4: Pesanan Terbaharu bagi Setiap Pelanggan

"Kembalikan pesanan paling terkini bagi setiap pelanggan." Ini ialah corak mengekalkan baris terbaharu bagi setiap kunci, yang diselesaikan dengan ROW_NUMBER yang dipartisikan mengikut pelanggan dan disusun mengikut tarikh menurun.

Tambahkan pemecah seri (pengenal pesanan) supaya hasilnya tetap apabila dua pesanan mempunyai tarikh yang sama; calon yang kukuh biasanya memasukkan perincian ini.

SELECT customer_id, id AS order_id, order_date, amount
FROM (
  SELECT o.*,
         ROW_NUMBER() OVER (
           PARTITION BY customer_id
           ORDER BY order_date DESC, id DESC
         ) AS rn
  FROM orders o
) t
WHERE rn = 1;

Masalah 5: Pertumbuhan Bulan ke Bulan

"Kira hasil bulanan yang telah dibayar serta peratus perubahannya berbanding bulan sebelumnya." Ini menggabungkan pengagregatan dalam CTE dengan LAG.

Langkah pertama mengagregatkan data mengikut bulan; langkah kedua membandingkan setiap bulan dengan bulan sebelumnya menggunakan LAG. Lindungi operasi bahagi supaya bulan pertama (yang tiada bulan sebelumnya) tidak menghasilkan ralat.

WITH monthly AS (
  SELECT DATE_TRUNC('month', order_date) AS mth,
         SUM(amount) AS revenue
  FROM orders
  WHERE status = 'paid'
  GROUP BY DATE_TRUNC('month', order_date)
)
SELECT mth,
       revenue,
       LAG(revenue) OVER (ORDER BY mth) AS prev_revenue,
       ROUND(
         100.0 * (revenue - LAG(revenue) OVER (ORDER BY mth))
         / NULLIF(LAG(revenue) OVER (ORDER BY mth), 0), 2
       ) AS pct_change
FROM monthly
ORDER BY mth;

Masalah 6: Produk Teratas bagi Setiap Kategori

"Bagi setiap kategori, kembalikan produk paling laris mengikut jumlah kuantiti." Gunakan corak N teratas bagi setiap kumpulan: agregatkan data, tentukan kedudukan dalam setiap bahagian, kemudian tapis kepada kedudukan 1.

Jika seri penting, gantikan ROW_NUMBER dengan RANK supaya semua peneraju bersama dipaparkan. Menamakan pilihan ini menunjukkan bahawa anda memahami perbezaannya.

WITH sales AS (
  SELECT p.category,
         p.name AS product,
         SUM(oi.quantity) AS qty
  FROM order_items oi
  JOIN products p ON p.id = oi.product_id
  GROUP BY p.category, p.name
)
SELECT category, product, qty
FROM (
  SELECT s.*,
         ROW_NUMBER() OVER (
           PARTITION BY category ORDER BY qty DESC
         ) AS rn
  FROM sales s
) r
WHERE rn = 1;

Masalah 7: Jumlah Hasil Terkumpul

"Paparkan jumlah hasil yang telah dibayar secara berjalan (terkumpul) mengikut hari." Fungsi tetingkap SUM dengan bingkai tersusun menghasilkan jumlah berjalan tanpa cantuman jadual sendiri.

Nyatakan penggunaan bingkai ROWS untuk pengumpulan sebenar baris demi baris; bingkai lalai RANGE boleh berkelakuan tidak dijangka apabila tarikh seri.

SELECT order_date,
       SUM(daily) OVER (
         ORDER BY order_date
         ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
       ) AS running_total
FROM (
  SELECT order_date, SUM(amount) AS daily
  FROM orders
  WHERE status = 'paid'
  GROUP BY order_date
) d
ORDER BY order_date;

Masalah 8: Hari Aktif Berturut-turut

"Cari pengguna yang mempunyai sekurang-kurangnya 3 hari berturut-turut yang mengandungi pesanan berbayar." Ini ialah variasi jurang dan kelompok yang menggunakan helah perbezaan nombor baris.

Menolak nombor baris bagi setiap pengguna daripada tarikh menghasilkan pemalar dalam larian berturut-turut. Oleh itu, anda boleh mengelompokkan data mengikut pemalar tersebut dan mengiranya. Ini ialah petunjuk kemahiran peringkat lanjutan.

WITH days AS (
  SELECT DISTINCT customer_id, order_date
  FROM orders WHERE status = 'paid'
),
grp AS (
  SELECT customer_id, order_date,
         order_date - (ROW_NUMBER() OVER (
           PARTITION BY customer_id ORDER BY order_date
         ) * INTERVAL '1 day') AS island
  FROM days
)
SELECT customer_id, COUNT(*) AS streak_len
FROM grp
GROUP BY customer_id, island
HAVING COUNT(*) >= 3;

Prestasi dan Kesilapan Lazim

Selepas pertanyaan yang betul, penemu duga akan bertanya "bagaimanakah anda akan menjadikannya lebih pantas?" dan memerhatikan sama ada anda terperangkap oleh perangkap lazim. Sediakan senarai semak:

  • Buat indeks pada lajur cantuman dan penapisan (contohnya orders(customer_id, status)); elakkan fungsi pada lajur berindeks dalam WHERE.
  • Utamakan EXISTS berbanding IN untuk anti-cantuman yang besar; NOT IN dengan NULL secara senyap tidak mengembalikan apa-apa.
  • Menapis lajur daripada cantuman luar dalam WHERE secara senyap menukarkannya menjadi cantuman dalaman.
  • Sentiasa tambahkan pemecah seri supaya hasil N teratas adalah tetap.
  • Periksa pelan EXPLAIN untuk mencari imbasan berjujukan pada jadual besar.

Semakan Pantas

Anda memerlukan satu pesanan paling terkini bagi setiap pelanggan, dan dua pesanan mungkin mempunyai tarikh yang sama.

Ulang Kaji: Set Simulasi Temu Duga Penuh

Anda telah menyelesaikan masalah temu duga yang paling kerap ditanya dari awal hingga akhir:

  • Pengagregatan + LIMIT untuk perbelanjaan N teratas.
  • Anti-cantuman dengan NOT EXISTS (selamat terhadap NULL).
  • DENSE_RANK untuk kedudukan ke-N tertinggi, ROW_NUMBER untuk pesanan terbaharu bagi setiap kunci dan item teratas bagi setiap kumpulan.
  • LAG untuk perbandingan bulan ke bulan, SUM OVER untuk jumlah terkumpul.
  • Helah nombor baris jurang dan kelompok untuk rentetan berturut-turut.
  • Akhiri setiap jawapan dengan membincangkan indeks, EXPLAIN dan kesilapan lazim.
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 “Set Soalan Temu Duga Olok-olok Lengkap” percuma?

Ya — teks penuh “Set Soalan Temu Duga Olok-olok Lengkap” 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 “Set Soalan Temu Duga Olok-olok Lengkap”?

Soalan menyeluruh berjangka masa yang menggabungkan cantuman, tetingkap dan CTE dalam keadaan temu duga. 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 “Set Soalan Temu Duga Olok-olok Lengkap” 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. Penormalan hingga 3NF
  2. Pemodelan ER dan Kardinaliti Hubungan
  3. Skema Bintang dan Reka Bentuk Gudang Data
  4. Set Soalan Temu Duga Olok-olok Lengkap
← Kembali ke Persediaan Temu Duga Pengaturcaraan