Wywiad z pytaniem SQL

19

Biorąc pod uwagę tabelę „pracownicy”

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

Tylko przy użyciu SQL można znaleźć wszystkie warianty przeniesienia pracowników z jednego działu do drugiego, dzięki czemu średnia pensja zarówno w dziale „odejścia”, jak i „przyjazdu” wzrosła.

PS Zadano mi pytanie w wywiadzie, który nigdy nie udzielił odpowiedzi, a Google niewiele pomaga.

Alexander
źródło
5
Mam nadzieję, że oczekiwali odpowiedzi: „Dlaczego małe litery tabeli i nazwy kolumn i dlaczego podkreślają, a nie wielbłąda”
Mikey Mouse
@MikeyMouse: dlaczego nie? Sprawa wielbłąda jest preferowanym sposobem zapisywania nazw tabel w SQL (przynajmniej skąd pochodzę)
a_horse_w_na_nazwa

Odpowiedzi:

22

Poszukujesz pracowników, którzy zarabiają poniżej średniej w bieżącym dziale, ale powyżej średniej w przyszłym nowym dziale.

Jednym z możliwych sposobów uzyskania wszystkich przeniesień pracowników, które by to spełniły, byłoby

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
źródło
Skąd wiesz, który dział jest „nowy”, a który „stary”?
mustaccio,
1
@mustaccio - Dział, w którym aktualnie się znajdują, znajduje się w tabeli employees. Znajduje to wszystkie działy, do których mogłyby przenieść (jeśli istnieją), które spełniają ten warunek.
Martin Smith,
10

Biorąc pod uwagę, że było to pytanie do wywiadu (a nie pytanie testowe ), istnieje kilka możliwości w zależności od kontekstu.

Pytanie jest niekompletne, jak stwierdzono i Nie mogębyć może nie należy na nie odpowiadać w obecnej formie ( patrz sekcja AKTUALIZACJA poniżej ). Czego brakuje? Na przykład:

  • Czy pytanie dotyczy przeszłych przelewów lub potencjalnych przyszłych przelewów? W sformułowaniu występuje dwuznaczność.
  • Czy w tej tabeli są inne pola, czy to wszystko? Jeśli tak, jakie one są?
  • Czy są jakieś ograniczenia lub indeksy zdefiniowane w tej tabeli? Gdzie jest reszta schematu?
  • Czy to system OLTP czy OLAP?

Jeśli jest to bardziej tabela OLTP, wówczas w employee_idpolu powinno być zdefiniowane ograniczenie PK / Unique Index / Unique . I w takim przypadku byłby tylko jeden wpis na, employee_ida zatem nie ma sposobu na określenie transferów (tj. Nie ma „starego” department_idzapisu).

Jeśli jest to bardziej tabela OLAP, może to być powolnie zmieniający się wymiar, w którym to przypadku będzie wiele employee_idrekordów. Ale nie byłoby też muszą być ValidFromi ValidTopola DATE / DateTime tak że odlotów i przylotów wydziałów mogą być określone w odpowiedniej kolejności. Bez tych pól nie ma sposobu, aby ustalić, który dział jest odlotem, a który przylotem . I nie wiedząc, że to rozróżnienie umożliwi odzyskanie rekordów, które są przeciwieństwem żądania.

Tak więc „kontekst” interpretacji tego pytania jest przyczyną, dla której pytanie jest sformułowane tak, jak jest.

  • Zapomniałeś pewnych szczegółów między wywiadem a pytaniem tutaj:

    Zdarza się, ale jeśli tak, to albo musisz zaktualizować pytanie, aby uzupełnić brakujące informacje, albo pozostanie bez odpowiedzi (przynajmniej jeśli chodzi o uzyskanie sensownej odpowiedzi).

  • Pytanie zostało dokładnie przetłumaczone tutaj, a ankieterzy (rozmówcy) nie znali ani nie zamierzali omawiać tych problemów :

    W takim przypadku, jeśli zdawałeś sobie sprawę z tych problemów i oni oczekiwali odpowiedzi, możesz użyć tego jako środka do wyeliminowania ich jako potencjalnego pracodawcy ;-).

  • Pytanie zostało dokładnie przetłumaczone tutaj, a te problemy były znane lub zamierzone przez ankietera (ów):

    W tym przypadku prawdopodobnie używali tego jako sposobu na wyplenienie ludzi, patrząc na coś więcej niż surową zdolność techniczną. Często jest to bardzo ważne, aby zadawać pytania, aby być bardzo jasne, o projekcie, nad którym pracujesz, ponieważ większość użytkowników końcowych i właścicieli produktów, etc nie myśleć / mówić w niskopoziomowych szczegółów technicznych i często opuścić niezbędne elementy. Ważne jest, aby nie zakładać, ale zamiast tego wrócić do źródła żądania, aby uzyskać wyjaśnienie, aby nie tracić czasu na pracę w złym kierunku.

    Pamiętaj, że nie rozmawiasz o stanowisko, aby po prostu odpowiedzieć na pytania techniczne w próżni. Prowadzisz rozmowę kwalifikacyjną w sprawie stanowiska do pracy nad projektami i zawsze pojawią się dwuznaczności i / lub wprowadzające w błąd informacje dotyczące tego, o co jesteś proszony. Dobry ankieter spróbuje zrozumieć zarówno twój poziom umiejętności, jak i efektywność. Tak zadawałem pytania podczas przeprowadzania wywiadów z ludźmi, aby wyeliminować osoby, które dobrze odpowiadają na pytania techniczne, ale wymagałyby zbyt dużego trzymania się za ręce i ostatecznie spowolniłyby zespół.


AKTUALIZACJA:

Aby wyjaśnić wyjaśnienie dla tych, którzy uważają, że jest to proste pytanie umiejętności zapytania, interpretowane tak, jak @Martin w swojej odpowiedzi: nie wiemy nawet, czy jest to dokładne sformułowanie pytania, które zostało przedstawione OP, ale wiemy, na tyle, na ile możemy ufać sytuacji, że zostało to udzielone w wywiadzie. I dobrzeankieterzy zadają pytanie, które nie tylko wykształci umiejętności techniczne kandydata, ale także jego umiejętności nietechniczne / „miękkie”. Możliwe, że Martin ma rację w swojej interpretacji, że pytanie dotyczy potencjalnych kombinacji transferu w przyszłości (tj. „Czasami cygaro to po prostu cygaro”). Gdyby to było pytanie testowe, byłbym zaskoczony, gdyby jego odpowiedź była nieprawidłowa. Ale to nie jest pytanie testowe. Jasne, może to być pytanie do rozmowy kwalifikacyjnej zadawane przez kogoś, kto nie próbuje zobaczyć, jakiego rodzaju osobą jest kandydat i jak zachowałby się na spotkaniu projektowym, gdzie takie dwuznaczności pojawiają się częściej niż większość ludzi nawet zauważa. Ale nie udzielono odpowiedzi,załatwia sprawę (wyszukaj na stronie hasło „Szukasz ludzi, którzy”, ale naprawdę powinieneś przeczytać całość). Tak więc pomiędzy dwoma kandydatami, którzy są równi pod każdym względem, ale jeden przyjął interpretację i był poprawny, podczas gdy drugi zadał pytania, a następnie otrzymał poprawną odpowiedź, zdecydowanie wybrałbym tego, który zadał pierwszy.

Solomon Rutzky
źródło
6
„wszystkie warianty” wydają mi się jasne, że chodzi o transfery hipotetyczne, a nie transfery historyczne. I wtedy na pytanie można w pełni odpowiedzieć za pomocą podanych informacji.
Martin Smith,
7
Jestem z Martinem. Pytanie jest dla mnie jasne i wystarczająca ilość informacji odpowiada na pytanie.
paparazzo
3
@MartinSmith Nie twierdzę, że twoja interpretacja nie jest poprawna lub że nie jest najbardziej prawdopodobna. Mówię, że to nie jedyne . Często zdarza się, że sformułowanie czegoś „wydaje się” jasne, ale wciąż jest niepoprawne ;-) Jak powiedziałem na początku, moja odpowiedź jest w świetle tego, że jest to pytanie wywiadowe, a nie testowe. I często proszono mnie o robienie rzeczy, które zostały „wyraźnie” określone, a jednak zupełnie nie były tym, czego ta osoba naprawdę chciała, ale nie byli świadomi, że proszą o coś złego, ponieważ zakładali, że wszyscy zgodzili się na terminologię.
Solomon Rutzky,
2
@ edc65 Dziękujemy. Biorąc pod uwagę, że moja troska dotyczy dwuznaczności, doceniam niejednoznaczność Waszego komentarza :).
Solomon Rutzky,
2
@srutzky Wydaje mi się, że tylko ja tu jestem z tobą :) Dziękuję za dodanie twojej odpowiedzi do miksu. Jako ktoś, kto przeprowadził setki wywiadów, tego rodzaju rozważnych odpowiedzi szukałem. Prawdopodobnie nie zadałbym tego pytania, ale gdybym to zrobił, idealny kandydat prawdopodobnie odpowiedziałby podobnie, a następnie, po wyjaśnieniu, napisałby takie pytanie jak Martin. Najważniejsze w czytaniu tych komentarzy jest to, że ludzie widzą rzeczy na różne sposoby i przyjmują różne założenia. Dlatego zawsze wyjaśniaj i potwierdzaj swoje założenia, szczególnie w sytuacji wywiadu!
Geoff Patterson