面试SQL问题

Ale*_*der 19 interview-question

给定一个表“员工”

 employee_id | salary | department_id 
-------------+--------+---------------
Run Code Online (Sandbox Code Playgroud)

仅使用 SQL 查找从一个部门到另一个部门的员工调动的所有变体,因此“出发”和“到达”部门的平均工资都增长了。

PS 我在面试中被问到这个问题,从来没有给出答案,谷歌也帮不上什么忙。

Mar*_*ith 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 
Run Code Online (Sandbox Code Playgroud)


Sol*_*zky 10

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

问题是不完整的陈述和 不能也许不应该以其当前的形式回答(请参阅下面的更新部分)。有什么不见了?嗯,例如:

  • 问题是询问过去的转移还是潜在的未来转移?措辞有歧义。
  • 此表中是否还有其他字段,还是所有字段?如果有,它们是什么?
  • 该表上是否定义了任何约束或索引?架构的其余部分在哪里?
  • 这是 OLTP 系统还是 OLAP?

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

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

因此,如何解释这个问题的“上下文”就是为什么这个问题如此陈述的原因。

  • 你忘记了采访和在这里询问之间的一些细节:

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

  • 问题已在此处准确转录,并且这些问题为采访者所知或有意为之:

    在这种情况下,如果您知道这些问题并且他们期待得到答案,那么您可以将其用作将他们淘汰为可能的雇主的一种方式 ;-)。

  • 该问题已在此处准确转录,并且这些问题面试官已知的或有意为之:

    在这种情况下,他们可能将其用作通过查看不只是原始技术能力来淘汰人的一种手段。由于大多数最终用户和产品所有者等不会思考/谈论低级技术细节,并且经常会遗漏必要的部分,因此提出问题以非常清楚您正在从事的项目通常非常重要。重要的是不要假设,而是回到请求的来源以获得澄清,这样您就不会浪费时间在错误的方向上工作。

    请记住,您不是在面试一个职位,只是在真空中回答技术问题。您正在面试一个项目工作职位,并且在要求一个人做的事情上总是存在歧义和/或误导性信息。一个好的面试官会试图了解你的技能水平,以及你是否真的会工作。我在面试人时问过这样的问题,以淘汰那些回答技术问题但需要太多手把手并最终拖慢团队速度的人。


更新:

只是为了澄清那些认为这是一个简单的查询技能问题的人的澄清,解释为@Martin 在他的回答中所做的解释:我们甚至不知道这是否是提交给 OP 的问题的确切措辞但是我们确实知道,在我们可以信任的情况下,这是在一次采访中给出的。和面试官提出的问题不仅会引出候选人的技术技能,还会引出他们的非技术/“软”技能。很可能马丁在他的解释中是正确的,即问题是询问潜在的未来转移组合(即“有时雪茄只是雪茄”)。如果这是一个测试问题,那么如果他的回答不正确,我会感到惊讶。但是,这不是测试题。当然,这可能是一个面试问题,他不是想看看候选人是什么类型的人,以及他们在设计会议上的表现,在这种情况下,这种模棱两可的出现比大多数人都注意到的要多。但没有得到任何答复,把事情做好(在页面上搜索“你正在寻找的人”,但你真的应该阅读整件事)。所以,在两个各方面都平等的候选人之间,一个假设解释正确,另一个提出问题然后得到正确答案,我肯定会选择第一个提问的。

  • 我和马丁在一起。这个问题对我来说很清楚,足够的信息回答了这个问题。 (7认同)
  • “所有变体”对我来说似乎很清楚,他们谈论的是假设性转移而不是历史性转移。然后这个问题完全可以用给定的信息回答。 (6认同)
  • @MartinSmith 我并不是说您的解释无效,或者它不是最有可能的解释。我是说它不是_唯一_一个。很多时候有些东西的措辞“看起来”很清楚,但仍然不正确;-) 正如我在开头所说的,我的回答是鉴于这是一个面试问题,而不是一个测试问题。我经常被要求做一些“明确”陈述的事情,但完全_不是_这个人真正想要的,但他们不知道他们要求的是错误的东西,因为他们假设每个人都同意术语。 (3认同)
  • @edc65 谢谢。鉴于我担心的是模棱两可,我很欣赏你评论中的诙谐模棱两可:)。 (2认同)
  • @srutzky 我想我是唯一一个和你在一起的人 :) 谢谢你在混合中添加你的答案。作为进行过数百次采访的人,这就是我想要的深思熟虑的回应类型。我可能不会问这个问题,但如果我问了,理想的候选人可能会做出类似的回应,然后在澄清之后,会写出像 Martin 那样的查询。阅读这些评论的主要内容是人们以不同的方式看待事物并做出不同的假设。所以总是澄清和确认你的假设,尤其是在面试的情况下! (2认同)