面试SQL问题


19

给表“员工”

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

只有使用SQL才能找到从一个部门转移到另一个部门的所有员工转移方式,因此“离职”部门和“到达”部门的平均薪水都在增长。

PS:我在一次采访中被问到这个问题,但从未给出答案,而Google几乎没有帮助。


5
我希望他们期待的答案是“为什么小写的表和列名,以及为什么用下划线而不是驼峰式的大写字母”
Mikey Mouse

@MikeyMouse:为什么不呢?驼峰式写法是在SQL中写表名的首选方式(至少我来自哪里)
a_horse_with_no_name 2015年

Answers:


22

因此,您正在寻找收入低于当前部门平均水平但高于预期的新部门平均水平的员工。

获得满足此要求的所有员工调动的一种可能方法是

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 

您如何知道哪个部门是“新”部门,哪个部门是“旧”部门?
mustaccio 2015年

1
@mustaccio-他们当前所在的部门在表中employees。这将找到可以转移到该条件的所有部门(如果有)。
马丁·史密斯

10

鉴于这是一个面试问题(而不是测试问题),所以取决于上下文,有几种可能性。

如前所述,问题不完整, 不能也许不应该以当前的形式回答(请参见下面的“更新”部分)。缺什么?好吧,例如:

  • 这个问题是关于过去的转移还是将来的潜在转移?措词含糊。
  • 该表中还有其他字段吗?还是全部?如果是这样,它们是什么?
  • 此表上定义了任何约束或索引吗?模式的其余部分在哪里?
  • 这是OLTP系统还是OLAP?

如果这更多的是OLTP表,则应在employee_id字段上定义PK /唯一索引/唯一约束。在那种情况下,每个记录只有一个条目employee_id,因此无法确定转移(即没有“旧” department_id记录)。

如果这更多是一个OLAP表,则它可能是一个缓慢变化的维,在这种情况下将有多个employee_id记录。但是,还需要有ValidFromValidToDATE / DATETIME字段,以便可以按正确的顺序确定出发到达部门。没有这些字段,就无法确定哪个部门是出发地,哪个部门是到达地。而且不知道这种区别将允许取回与请求相反的记录。

因此,有关如何解释此问题的“上下文”就是这样陈述问题的原因。

  • 您在面试和在此处提问之间忘记了一些细节:

    它确实发生了,但是如果是这种情况,那么您要么需要更新问题以填写缺少的信息,要么就无法回答(至少就获得有意义的答案而言)。

  • 该问题已在此处准确记录下来,并且面试官知道这些问题或并非故意将这些问题考虑在内:

    在这种情况下,如果您知道这些问题并且他们期望得到答案,那么您可以使用它作为除掉可能的雇主之外的手段;-)。

  • 该问题已在此处准确记录,这些问题为面试官了解或为他们所预期:

    在这种情况下,他们可能会以此为手段,除查看原始的技术能力外,还将人们除草。在大多数情况下,提出问题要非常清楚,因为大多数最终用户和产品所有者等不会以低级的技术细节来思考/说话,因此往往会遗漏必要的内容。重要的是不要假设而是要回到请求的源头进行澄清,以免浪费时间在错误的方向上工作。

    请记住,您并不是在面试,只是简单地回答技术问题。您正在面试一个从事项目工作的职位,而在要求做的事情上总会有歧义和/或误导性信息。一位优秀的面试官将设法了解您的技能水平以及您是否真正有生产力。在采访人们时,我曾问过类似的问题,以淘汰那些在回答技术问题上表现出色的人,但是他们需要太多的手把手,最终会拖慢团队的速度。


更新:

只是为了澄清那些觉得这是一个简单查询技能问题的人的澄清,解释为@Martin在他的回答中所做的事情:我们甚至不知道这是否是提交给OP的问题的确切措词,但是我们确实知道,在我们可以相信的情况下,这是在一次采访中给出的。和面试官提出的问题是,不仅要培养候选人的技术技能,还要培养他们的非技术/“软”技能。马丁很正确的解释是,这个问题正在询问潜在的未来转移组合(即“有时雪茄只是雪茄”),这很可能是正确的。如果这是一个测试问题,那么如果他的回答不正确,我将感到惊讶。但是,这不是测试问题。当然,这可能是一个面试问题,某个人不想看到候选人是什么类型的人,以及他们在设计会议上的表现如何,而这种会议通常会引起大多数人甚至不知道。但是没有给出答案,完成工作(在页面上搜索“您正在寻找谁的人”,但您应该真正阅读全部内容)。因此,在所有方式上都是平等的两个候选人之间,其中一个假设了解释并且是正确的,而另一个问了问题然后又得到了正确的答案,我肯定会同意第一个问的人。


6
在我看来,“所有的变体”似乎很清楚,他们在说的是假想的转移,而不是历史的转移。然后,使用给定的信息就可以完美地回答问题。
马丁·史密斯

7
我和马丁在一起。这个问题对我很清楚,并且足够的信息回答了这个问题。
狗仔队2015年

3
@MartinSmith我并不是说您的解释不是有效的解释,也不是最有可能的解释。我说这不是唯一的。很多时候,“似乎”的措词很清楚,但仍然不正确;-)正如我在开始时所说,我的回答是因为这是一个面试问题,而不是测试问题。我经常被要求做“明确”陈述的事情,但完全不是那个人真正想要的,但是他们不知道自己在要求错误的事情,因为他们假设每个人都同意术语。
所罗门·鲁兹基

2
@ edc65谢谢。鉴于我担心的是模棱两可,因此,我很欣赏您的评论含糊不清:)。
所罗门·鲁兹基

2
@srutzky我想我是唯一和你在一起的人:)谢谢你将你的答案添加到混音中。作为进行过数百次面试的人,这是我想要的一种深思熟虑的回应。我可能不会问这个问题,但是如果我这样做了,理想的候选人可能会做出类似的回答,然后在澄清之后,写一个像马丁的查询。阅读这些评论的主要收获是,人们以不同的方式看待事物并做出不同的假设。因此,请务必弄清并确认您的假设,尤其是在面试时!
Geoff Patterson
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.