Pregunta SQL de entrevista

19

Dada una mesa 'empleados'

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

Solo utilizando SQL encuentre todas las variantes de transferencias de empleados de un departamento a otro, de modo que creció el salario promedio tanto en el departamento de 'salida' como en el de 'llegada'.

PD: Me hicieron la pregunta en una entrevista, que nunca dio una respuesta, y Google es de poca ayuda.

Alejandro
fuente
55
Espero que la respuesta que esperaban fuera "¿Por qué los nombres de tabla y columna en minúsculas, y por qué subrayan en lugar de la carcasa de camello"
Mikey Mouse
@MikeyMouse: ¿por qué no? Caso camello es la forma preferida para escribir los nombres de tabla en SQL (al menos donde yo vengo)
a_horse_with_no_name

Respuestas:

22

Por lo tanto, está buscando empleados que ganen por debajo del promedio en su departamento actual, pero por encima del promedio en su posible nuevo departamento.

Una posible forma de obtener todas las transferencias de empleados que cumplirían esto sería

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
fuente
¿Cómo saber qué departamento es "nuevo" y cuál es "viejo"?
mustaccio
1
@mustaccio - El departamento en el que están actualmente está en la tabla employees. Esto encuentra todos los departamentos a los que podrían transferir (si corresponde) que cumplan con la condición.
Martin Smith
10

Dado que esta fue una pregunta de entrevista (y no una pregunta de prueba ), existen algunas posibilidades dependiendo del contexto.

La pregunta está incompleta como se indicó y no puedo quizás no debería responderse en su forma actual ( consulte la sección ACTUALIZACIÓN a continuación ). ¿Lo que falta? Bueno, por ejemplo:

  • ¿Se hace la pregunta sobre transferencias pasadas o posibles transferencias futuras? Hay ambigüedad en la redacción.
  • ¿Hay otros campos en esta tabla o son todos ellos? Si es así, ¿Que son?
  • ¿Hay restricciones o índices definidos en esta tabla? ¿Dónde está el resto del esquema?
  • ¿Es este un sistema OLTP o OLAP?

Si se trata más de una tabla OLTP, entonces debería haber una PK / Índice único / restricción única definida en el employee_idcampo. Y en ese caso, solo habría una entrada por employee_idy, por lo tanto, no hay forma de determinar las transferencias (es decir, no hay una "antigua"department_id registro ).

Si se trata más de una tabla OLAP, entonces podría ser una dimensión que cambia lentamente, en cuyo caso habría múltiples employee_idregistros. Pero, también tendría que ser ValidFromy ValidTocampos de fecha / DATETIME por lo que la salida y llegada de los departamentos pueden ser determinados en su secuencia apropiada. Sin estos campos no hay forma de determinar qué departamento es la salida y cuál es la llegada . Y no saber esa distinción permitiría recuperar registros que son lo contrario de la solicitud.

Entonces, ese "contexto" sobre cómo interpretar esta pregunta es la razón por la cual la pregunta se plantea como es.

  • Olvidó algunos detalles entre la entrevista y preguntar aquí:

    Sucede, pero si este es el caso, entonces debe actualizar la pregunta para completar la información que falta, o permanecerá sin respuesta (al menos en términos de obtener una respuesta significativa).

  • La pregunta ha sido transcrita con precisión aquí, y estos problemas no fueron el entrevistador (s) conocía, ni pretendía, :

    En este caso, si estaba al tanto de estos problemas y esperaban una respuesta, puede usar esto como un medio para descartarlos como posible empleador ;-).

  • La pregunta ha sido transcrita con precisión aquí, y estos problemas fueron sabe que, o destinado por el entrevistador (s):

    En este caso, probablemente estaban usando esto como un medio para eliminar a las personas al observar más que la capacidad técnica en bruto. A menudo es muy importante hacer preguntas para ser muy claro el proyecto en el que está trabajando, ya que la mayoría de los usuarios finales y propietarios de productos, etc., no piensan / hablan con detalles técnicos de bajo nivel y a menudo omiten las piezas necesarias. Es importante no asumir, sino volver al origen de la solicitud para obtener una aclaración para que no pierda el tiempo trabajando en la dirección incorrecta.

    Recuerde que no está entrevistando para un puesto que simplemente responda preguntas técnicas en el vacío. Usted está entrevistando para un puesto de trabajo en proyectos y siempre habrá ambigüedades y / o información engañosa en lo que se le pide que haga. Un buen entrevistador tratará de comprender su nivel de habilidad y si realmente será productivo. He hecho preguntas como esta al entrevistar a personas para eliminar a las personas que responden bien a las preguntas técnicas, pero que necesitarían demasiado agarre de la mano y terminarían ralentizando al equipo.


ACTUALIZAR:

Solo para aclarar la aclaración para aquellos que sienten que esta es una pregunta de habilidad de consulta simple, interpretada como @Martin lo ha hecho en su respuesta: ni siquiera sabemos si esta es la redacción exacta de la pregunta que se presentó al OP, pero sabemos, en la medida en que podemos confiar en la situación, que esto se dio en una entrevista. Y buenolos entrevistadores hacen preguntas que no solo extraen las habilidades técnicas de los candidatos, sino también sus habilidades no técnicas / "blandas". Bien podría ser que Martin tenga razón en su interpretación de que la pregunta es sobre posibles combinaciones de transferencia futuras (es decir, "a veces un cigarro es solo un cigarro"). Y si esta fuera una pregunta de prueba, me sorprendería que su respuesta no fuera correcta. Pero, esta no es una pregunta de prueba. Claro, podría ser una pregunta de entrevista hecha por alguien que no está tratando de ver qué tipo de persona es el candidato y cómo se desempeñaría en una reunión de diseño donde tales ambigüedades surgen con más frecuencia de lo que la mayoría de las personas notan. Pero no se dio respuesta,hace las cosas (busca en la página "Estás buscando personas que", pero realmente deberías leerlo todo). Entonces, entre dos candidatos que son iguales en todos los sentidos, pero uno asumió la interpretación y fue correcto, mientras que el otro hizo preguntas y luego obtuvo la respuesta correcta, definitivamente iría con el que preguntó primero.

Solomon Rutzky
fuente
66
"Todas las variantes" me parece claro que están hablando de transferencias hipotéticas, no de transferencias históricas. Y luego la pregunta es perfectamente responsable con la información dada.
Martin Smith
77
Estoy con martin La pregunta es clara para mí y suficiente información responde a la pregunta.
paparazzo
3
@ MartinSmith No estoy diciendo que su interpretación no sea válida, o que no sea la más probable. Estoy diciendo que no es el único . A menudo hay momentos en que la redacción de algo "parece" clara, pero sigue siendo incorrecta ;-) Como dije al principio, mi respuesta es a la luz de que se trata de una pregunta de entrevista, no una pregunta de prueba. Y a menudo se me ha pedido que haga cosas que estaban "claramente" establecidas, y que, sin embargo, no eran del todo lo que la persona realmente quería, pero no sabían que estaban pidiendo algo incorrecto porque asumían que todos estaban de acuerdo con la terminología.
Solomon Rutzky
2
@ edc65 Gracias. Dado que mi preocupación es sobre la ambigüedad, agradezco la ambigüedad irónica de tu comentario :).
Solomon Rutzky
2
@srutzky Creo que soy el único que está contigo aquí :) Sin embargo, gracias por agregar tu respuesta a la mezcla. Como alguien que ha realizado cientos de entrevistas, este es el tipo de respuesta reflexiva que estaría buscando. Probablemente no haría esta pregunta, pero si lo hiciera, un candidato ideal probablemente respondería de manera similar y luego, después de una aclaración, escribiría una consulta como la de Martin. La conclusión principal al leer estos comentarios es que las personas ven las cosas de diferentes maneras y hacen diferentes suposiciones. ¡Así que siempre aclare y confirme sus suposiciones, especialmente en una situación de entrevista!
Geoff Patterson