Persediaan Temu Duga SQL · Pelajaran

Membandingkan Baris Dalam Satu Jadual

Corak cantuman kendiri untuk mencari pasangan, pendua dan rekod bersebelahan

Pelajaran 3 daripada 413 langkah

Membandingkan Baris Dalam Satu Jadual ialah pelajaran Persediaan Temu Duga SQL percuma di CoddyKit. Ini ialah pelajaran 3 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.

Cantuman Kendiri untuk Perbandingan Baris dengan Baris

Selain hierarki, satu lagi kegunaan utama cantuman kendiri ialah membandingkan baris dalam jadual yang sama antara satu sama lain. Daripada hubungan induk-anak, anda memadankan baris sewenang-wenangnya untuk mencari pendua, padanan hampir sama atau rekod bersebelahan.

Coraknya sama: berikan nama pengganti kepada jadual dua kali dan tulis syarat ON yang menyatakan hubungan antara dua baris yang hendak dipadankan.

Mencari Pasangan dalam Kumpulan yang Sama

Soalan klasik: cari semua pasangan pekerja yang bekerja dalam jabatan yang sama. Cantumkan jadual dengan dirinya sendiri berdasarkan jabatan yang sama, tetapi kekalkan kedua-dua baris berbeza.

Cantuman naif juga akan memadankan setiap pekerja dengan dirinya sendiri dan menghasilkan setiap pasangan dua kali. Kita membaikinya selepas ini.

SELECT a.name, b.name, a.department
FROM employees a
JOIN employees b ON a.department = b.department;

Membuang Pasangan Kendiri dan Pendua Cermin

Dua masalah apabila memadankan kumpulan yang sama: satu baris sepadan dengan dirinya sendiri (Alice dengan Alice), dan setiap pasangan muncul dua kali (Alice-Bob dan Bob-Alice).

Baiki kedua-duanya dengan satu ketaksamaan: a.id < b.id. Ini menjamin kedua-dua baris berbeza dan mengekalkan hanya satu susunan bagi setiap pasangan.

SELECT a.name, b.name, a.department
FROM employees a
JOIN employees b
  ON a.department = b.department
 AND a.id < b.id;

Mengapa a.id < b.id dan Bukan a.id <> b.id

Menggunakan a.id <> b.id membuang pasangan kendiri tetapi masih mengembalikan kedua-dua susunan, lalu menggandakan hasil anda. Menggunakan a.id < b.id membuang pasangan kendiri dan menghapuskan pendua cermin dalam satu langkah.

Penemuduga memberi perhatian khusus kepada pilihan < berbanding <>; ini menunjukkan bahawa anda memahami kombinatorik cantuman kendiri.

-- <>  keeps Alice-Bob AND Bob-Alice (duplicated)
-- <   keeps only Alice-Bob (correct unique pairs)

Mencari Baris Pendua

Untuk mencari rekod yang menduplikasi satu sama lain pada lajur kunci, lakukan cantuman kendiri berdasarkan lajur tersebut dan syaratkan kunci utama yang berbeza.

Di sini kita mendedahkan pelanggan yang berkongsi alamat e-mel. a.id < b.id memastikan setiap pasangan pendua muncul sekali. Selalunya GROUP BY ... HAVING COUNT(*) > 1 lebih kemas, tetapi cantuman kendiri menunjukkan pasangan bermasalah sebenar bersebelahan.

SELECT a.id, b.id, a.email
FROM customers a
JOIN customers b
  ON a.email = b.email
 AND a.id < b.id;

Membandingkan Rekod Bersebelahan

Tugas penganalisis yang kerap: bandingkan setiap baris dengan baris seterusnya dalam urutan, contohnya jualan setiap hari dengan hari sebelumnya. Cantuman kendiri boleh memadankan baris berturutan.

Di sini kita mencantumkan setiap hari dengan baris yang tepat satu hari lebih awal untuk mengira perbezaan. Ini berfungsi apabila urutan tiada jurang.

SELECT t.day, t.amount,
       t.amount - y.amount AS change_vs_prev
FROM daily_sales t
JOIN daily_sales y
  ON y.day = t.day - INTERVAL '1 day';

Masalah Jurang dalam Cantuman Kendiri Bersebelahan

Pertanyaan sebelumnya gagal jika satu hari tiada: tiada baris yang tepat satu hari sebelumnya, jadi baris itu hilang (cantuman dalam) atau anda perlu mengendalikan NULL.

Inilah sebabnya penemuduga sering mengarahkan anda kepada fungsi tetingkap seperti LAG untuk 'bandingkan dengan baris sebelumnya', yang menggunakan kedudukan ordinal dan bukannya padanan nilai serta menangani jurang dengan baik.

-- LAG handles gaps; the self join assumed contiguous days
SELECT day, amount,
       amount - LAG(amount) OVER (ORDER BY day) AS change_vs_prev
FROM daily_sales;

Cantuman Kendiri berbanding Fungsi Tetingkap

Fahami komprominya:

  • cantuman kendiri membandingkan baris berdasarkan hubungan nilai (jabatan yang sama, tarikh terdahulu). Kaedah ini anjal tetapi boleh menggandakan baris dan mengendalikan jurang dengan tidak tepat.
  • fungsi tetingkap membandingkan baris berdasarkan kedudukan mengikut tertib dalam partition yang disusun. Kaedah ini lebih kemas untuk logik baris sebelumnya atau seterusnya.

Untuk 'membandingkan dengan baris bersebelahan,' utamakan LAG/LEAD. Untuk 'mencari semua pasangan yang sepadan dengan suatu syarat,' cantuman kendiri ialah alat yang semula jadi.

Mencari Baris yang Mengatasi Rakan Setara

Satu lagi corak: cari pekerja yang memperoleh pendapatan lebih tinggi daripada sekurang-kurangnya seorang rakan sekerja dalam jabatan mereka. Cantuman kendiri menyatakan perkara ini secara langsung.

Kita mencantumkan setiap pekerja dengan pekerja lain dalam jabatan yang sama dan berpendapatan lebih rendah, kemudian mengekalkan pekerja unik yang muncul. Ayat ini hampir sama seperti ayat dalam bahasa Melayu.

SELECT DISTINCT a.name, a.department, a.salary
FROM employees a
JOIN employees b
  ON a.department = b.department
 AND a.salary > b.salary;

Beri Perhatian kepada Penggandaan Baris

Cantuman kendiri pada lajur yang tidak unik menggandakan baris. Memadankan orang dalam jabatan yang mempunyai 100 orang menghasilkan kira-kira 100 x 100 pasangan calon sebelum penapisan.

Sentiasa sertakan predikat penyahduplikatan (a.id < b.id) dan tambahkan DISTINCT atau pengelompokan apabila anda hanya memerlukan baris yang terlibat, bukan setiap pasangan. Nyatakan kesedaran tentang penggandaan baris ini dalam temu duga.

Memilih Alat Perbandingan

Panduan membuat keputusan untuk perbandingan dalam jadual:

  • Semua pasangan yang sepadan (pendua, gabungan dalam kumpulan yang sama): cantuman kendiri dengan a.id < b.id.
  • Baris sebelumnya atau seterusnya dalam suatu susunan: fungsi tetingkap (LAG/LEAD).
  • Membandingkan setiap baris dengan agregat kumpulan: subpertanyaan berkorelasi atau agregat tetingkap.

Semakan Pantas

Anda mahukan setiap pasangan produk unik yang berkongsi kategori yang sama, tanpa produk dipasangkan dengan dirinya sendiri dan tanpa susunan pendua.

Rumusan: Membandingkan Baris dalam Satu Jadual

Kesimpulan utama:

  • Gunakan cantuman kendiri pada jadual untuk memasangkan barisnya sendiri bagi mencari pendua dan gabungan dalam kumpulan yang sama.
  • Gunakan a.id < b.id untuk membuang pasangan dengan diri sendiri dan pendua terbalik melalui satu predikat.
  • Perbandingan kedekatan melalui cantuman kendiri gagal apabila terdapat jurang; utamakan LAG/LEAD untuk logik baris sebelumnya atau seterusnya.
  • Sentiasa ambil kira penggandaan baris apabila mencantumkan lajur yang tidak unik.
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 “Membandingkan Baris Dalam Satu Jadual” percuma?

Ya — teks penuh “Membandingkan Baris Dalam Satu Jadual” 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 “Membandingkan Baris Dalam Satu Jadual”?

Corak cantuman kendiri untuk mencari pasangan, pendua dan rekod bersebelahan 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 3 daripada 4.

Berapa lamakah pelajaran “Membandingkan Baris Dalam Satu Jadual” 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. CROSS JOIN dan Hasil Cartesian
  2. SELF JOIN untuk Hierarki
  3. Membandingkan Baris Dalam Satu Jadual
  4. Memilih Jenis Cantuman yang Tepat
← Kembali ke Persediaan Temu Duga SQL