Wawancara pertanyaan SQL

19

Diberikan tabel 'karyawan'

 employee_id | salary | department_id 
-------------+--------+---------------

Hanya dengan menggunakan SQL, temukan semua varian transfer karyawan dari satu departemen ke departemen lainnya, sehingga gaji rata-rata di departemen 'keberangkatan' dan 'kedatangan' bertambah.

PS Saya ditanya pertanyaan dalam sebuah wawancara, yang tidak pernah memberikan jawaban, dan Google tidak banyak membantu.

Alexander
sumber
5
Saya berharap jawaban yang mereka harapkan adalah "Mengapa tabel huruf kecil dan nama kolom, dan mengapa menggarisbawahi daripada casing unta"
Mikey Mouse
@MikeyMouse: mengapa tidak? Kasing unta adalah cara yang lebih disukai untuk menulis nama tabel dalam SQL (setidaknya dari mana saya berasal)
a_horse_with_no_name

Jawaban:

22

Jadi Anda mencari Karyawan yang berpenghasilan di bawah rata-rata di departemen saat ini tetapi di atas rata-rata di departemen baru yang prospektif.

Salah satu cara yang mungkin untuk mendapatkan semua transfer karyawan yang memenuhi ini adalah

WITH departments
     AS (SELECT AVG(salary) AS AvgSalary,
                department_id
         FROM   employees
         GROUP  BY department_id)
SELECT e.employee_id,
       dept_current.department_id AS current_department_id,
       dept_new.department_id     AS new_department_id
FROM   employees e
       JOIN departments dept_current
         ON e.department_id = dept_current.department_id
            AND dept_current.AvgSalary > e.salary
       JOIN departments dept_new
         ON dept_new.AvgSalary < e.salary 
Martin Smith
sumber
Bagaimana Anda tahu departemen mana yang "baru" dan yang mana yang "lama"?
mustaccio
1
@ustaccio - Departemen mereka saat ini ada di tabel employees. Ini menemukan semua departemen yang dapat mereka transfer ke (jika ada) yang memenuhi persyaratan.
Martin Smith
10

Mengingat bahwa ini adalah pertanyaan wawancara (dan bukan pertanyaan tes ), ada beberapa kemungkinan tergantung pada konteksnya.

Pertanyaannya tidak lengkap seperti yang dinyatakan dan tidak bisamungkin sebaiknya tidak dijawab dalam bentuk saat ini ( silakan lihat bagian PEMBARUAN di bawah ). Apa yang hilang? Nah, misalnya:

  • Apakah pertanyaannya adalah tentang transfer di masa lalu atau potensi transfer di masa depan? Ada ambiguitas dalam kata-katanya.
  • Apakah ada bidang lain dalam tabel ini atau ini semuanya? Jika demikian, apakah mereka?
  • Apakah ada batasan atau indeks yang ditentukan pada tabel ini? Di mana sisa skema?
  • Apakah ini sistem OLTP atau OLAP?

Jika ini lebih dari tabel OLTP, maka harus ada PK / Indeks Unik / batasan unik yang ditentukan di employee_idlapangan. Dan dalam hal itu, hanya akan ada satu entri per employee_iddan karenanya tidak ada cara untuk menentukan transfer (yaitu tidak ada department_idcatatan "lama" ).

Jika ini lebih dari tabel OLAP, maka ini bisa menjadi Dimensi yang Berubah Secara Lambat, dalam hal ini akan ada banyak employee_idrekaman. Tapi, ada juga perlu ValidFromdan ValidTobidang DATE / DATETIME sehingga keberangkatan dan kedatangan departemen dapat ditentukan dalam urutan yang tepat. Tanpa bidang-bidang ini, tidak ada cara untuk menentukan departemen mana yang merupakan keberangkatan dan mana yang merupakan kedatangan . Dan tidak mengetahui perbedaan itu akan memungkinkan untuk mendapatkan catatan kembali yang merupakan kebalikan dari permintaan.

Jadi, "konteks" untuk bagaimana menafsirkan pertanyaan ini adalah alasan mengapa pertanyaan itu dinyatakan seperti itu.

  • Anda lupa beberapa detail antara wawancara dan menanyakannya di sini:

    Itu terjadi, tetapi jika ini masalahnya, maka Anda harus memperbarui pertanyaan untuk mengisi informasi yang hilang, atau tetap tidak terjawab (setidaknya dalam hal mendapatkan jawaban yang bermakna).

  • Pertanyaannya telah secara akurat ditranskripsikan di sini, dan masalah-masalah ini tidak diketahui, atau dimaksudkan oleh, pewawancara:

    Dalam hal ini, jika Anda mengetahui masalah ini dan mereka mengharapkan jawaban, maka Anda dapat menggunakan ini sebagai cara untuk menyingkirkan mereka sebagai majikan yang mungkin ;-).

  • Pertanyaannya telah secara akurat ditranskripsikan di sini, dan masalah-masalah ini diketahui, atau dimaksudkan oleh, pewawancara:

    Dalam hal ini, mereka mungkin menggunakan ini sebagai cara menyiangi orang dengan melihat lebih dari kemampuan teknis mentah. Seringkali sangat penting untuk mengajukan pertanyaan dengan sangat jelas tentang proyek yang sedang Anda kerjakan karena sebagian besar pengguna akhir dan pemilik produk, dll. Penting untuk tidak berasumsi tetapi sebaliknya untuk kembali ke sumber permintaan untuk mendapatkan klarifikasi sehingga Anda tidak membuang waktu untuk bekerja ke arah yang salah.

    Ingatlah bahwa Anda tidak mewawancarai suatu posisi untuk hanya menjawab pertanyaan teknis dalam ruang hampa. Anda sedang mewawancarai suatu posisi untuk mengerjakan proyek dan akan selalu ada ambiguitas dan / atau informasi yang menyesatkan tentang apa yang diminta untuk dilakukan. Pewawancara yang baik akan mencoba memahami tingkat keahlian Anda dan apakah Anda benar-benar produktif. Saya telah mengajukan pertanyaan seperti ini ketika mewawancarai orang-orang untuk menyingkirkan orang-orang yang dapat menjawab pertanyaan teknis dengan baik tetapi akan membutuhkan terlalu banyak pegangan tangan dan akhirnya memperlambat tim.


MEMPERBARUI:

Hanya untuk mengklarifikasi klarifikasi bagi mereka yang merasa bahwa ini adalah pertanyaan keterampilan kueri sederhana, yang ditafsirkan sebagai @Martin telah dilakukan dalam jawabannya: kita bahkan tidak tahu apakah ini adalah kata-kata yang tepat dari pertanyaan yang diajukan kepada OP Tapi kita tahu, sejauh kita dapat mempercayai situasinya, bahwa ini diberikan dalam sebuah wawancara. Dan baguspewawancara mengajukan pertanyaan yang tidak hanya menarik keterampilan teknis calon, tetapi juga keterampilan non-teknis / "lunak" mereka. Sangat mungkin bahwa Martin benar dalam interpretasinya bahwa pertanyaannya adalah menanyakan tentang kemungkinan kombinasi transfer di masa depan (yaitu "kadang-kadang cerutu hanya cerutu"). Dan jika ini adalah pertanyaan ujian, maka saya akan terkejut jika jawabannya tidak benar. Tapi, ini bukan pertanyaan ujian. Tentu, itu bisa menjadi pertanyaan wawancara yang diajukan oleh seseorang yang tidak mencoba melihat orang seperti apa kandidatnya dan bagaimana mereka akan tampil dalam pertemuan desain di mana ambiguitas seperti itu muncul lebih sering daripada yang disadari kebanyakan orang. Tapi tidak ada jawaban yang diberikan,menyelesaikan sesuatu (cari di halaman untuk "Anda mencari orang yang", tetapi Anda harus benar-benar membaca semuanya). Jadi, antara dua kandidat yang sama dalam semua hal, tetapi yang satu menganggap penafsiran dan benar, sementara yang lain mengajukan pertanyaan dan kemudian mendapat jawaban yang benar, saya pasti akan pergi dengan yang bertanya dulu.

Solomon Rutzky
sumber
6
"semua varian" tampak jelas bagi saya bahwa mereka berbicara tentang transfer hipotetis bukan transfer historis. Dan kemudian pertanyaan itu sepenuhnya terjawab dengan informasi yang diberikan.
Martin Smith
7
Saya dengan Martin. Pertanyaannya jelas bagi saya dan informasi yang cukup menjawab pertanyaan itu.
paparazzo
3
@ MartinSmith Saya tidak mengatakan bahwa penafsiran Anda bukan yang valid, atau itu bukan yang paling mungkin. Saya mengatakan bahwa itu bukan satu - satunya . Sering ada saat-saat kata-kata sesuatu "tampaknya" jelas, tetapi masih salah ;-) Seperti yang saya katakan di awal, jawaban saya adalah pertanyaan wawancara, bukan pertanyaan tes. Dan saya sering diminta untuk melakukan hal-hal yang "jelas" dinyatakan, namun sama sekali bukan apa yang orang itu inginkan, tetapi mereka tidak sadar bahwa mereka meminta hal yang salah karena mereka menganggap semua orang sepakat tentang terminologi.
Solomon Rutzky
2
@ edc65 Terima kasih. Mengingat bahwa kekhawatiran saya adalah tentang ambiguitas, saya menghargai ambiguitas lidah-di-pipi dari komentar Anda :).
Solomon Rutzky
2
@srutzky Kurasa aku satu-satunya yang bersamamu di sini :) Terima kasih telah menambahkan jawabanmu ke dalam campuran. Sebagai seseorang yang telah melakukan ratusan wawancara, ini adalah jenis tanggapan bijaksana yang saya cari. Saya mungkin tidak akan mengajukan pertanyaan ini, tetapi jika saya melakukannya, seorang kandidat yang ideal kemungkinan akan menjawab hal yang sama dan kemudian, setelah klarifikasi, akan menulis pertanyaan seperti Martin. Hal utama dalam membaca komentar ini adalah bahwa orang melihat sesuatu dengan cara yang berbeda dan membuat asumsi yang berbeda. Jadi selalu jelaskan dan konfirmasikan asumsi Anda, terutama dalam situasi wawancara!
Geoff Patterson