02.28 數據科學家常見的五個 SQL 面試問題

數據科學家常見的五個 SQL 面試問題

數據科學家常見的五個 SQL 面試問題

作者 | Alexei Ledenev

翻譯 | 天道酬勤,責編 | Carol

出品 | CSDN雲計算(ID:CSDNcloud)

在任何以數據為中心的工作中,對SQL有深刻的理解都是成功的關鍵,儘管這不是工作中最有趣的部分。事實上,除了SELECT FROM WHERE GROUP BY ORDER BY之外,還有更多的SQL方法。你知道的功能越多,操作和查詢所需的內容就越容易。

作者希望在本文中學習和交流以下兩件事:

1)學習和教一些基本功能以外的SQL函數;2)探討一些SQL面試練習問題。

* 本文中的問題僅來自Leetcode

数据科学家常见的五个 SQL 面试问题

問題1:第二高的薪水

編寫一個SQL查詢用於從Employee表中獲取第二高的薪水。例如,給定下面的Employee表,查詢應返回200作為第二高的薪水。如果沒有第二高的薪水,則查詢應返回。

<code>+----+--------+/<code><code>| Id | Salary |/<code><code>+----+--------+/<code><code>| 1 | 100 |/<code><code>| 2 | 200 |/<code><code>| 3 | 300 |/<code><code>+----+--------+/<code>

1)解決方案A使用IFOFFSET

  • IF(表達,alt):如果為,則if返回指定的值,否則返回期望的值。 如果沒有第二高的薪水,我們會使用它返回。

  • OFFSET:offset與ORDERBY子句一起使用可忽略指定的前n行。這會很有用,因為你希望獲得第二行(第二高的薪水)

<code>| Id | Salary |/<code><code>+----+--------+/<code><code>| 1 | 100 |/<code><code>| 2 | 200 |/<code><code>| 3 | 300 |/<code><code>+----+--------+/<code>

2)解決方案B使用MAX

此查詢表示選擇的MAX薪水不等於最高薪水,這等於選擇第二高的薪水。

<code>SELECT/<code><code>IF(/<code><code>(SELECT DISTINCT Salary/<code><code>FROM Employee/<code><code>ORDER BY Salary DESC/<code><code>LIMIT 1 OFFSET 1/<code><code>), ) as SecondHighestSalary/<code><code>FROM Employee/<code><code>LIMIT 1/<code>
数据科学家常见的五个 SQL 面试问题
数据科学家常见的五个 SQL 面试问题

問題2:重複的電子郵件

編寫SQL查詢以在名為Person的表中查找所有重複的電子郵件。

<code>+----+---------+/<code><code>| Id | Email |/<code><code>+----+---------+/<code><code>| 1 | [email protected] |/<code><code>| 2 | [email protected] |/<code><code>| 3 | [email protected] |/<code><code>+----+---------+/<code>

1)解決方案A子查詢中的

COUNT

首先,創建一個子查詢來顯示每封電子郵件的頻率次數。然後子查詢在計數大於1的地方被過濾。

<code>SELECT Email/<code><code>FROM (/<code><code>SELECT Email, count(Email) AS count/<code><code>FROM Person/<code><code>GROUP BY Email/<code><code>) as email_count/<code><code>WHERE count > 1/<code>

2)解決方案B:HAVING子句

  • HAVING是一個子句,從本質上講,你可以將WHERE語句與聚合(GROUP BY)結合使用。

<code>SELECT Email/<code><code>FROM Person/<code><code>GROUP BY Email/<code><code>HAVING count(Email) > 1/<code>
数据科学家常见的五个 SQL 面试问题

問題3:溫度上升

下面給定一個天氣表,編寫一個SQL查詢來查找與其之前(昨天)日期相比溫度更高的所有日期的ID。

<code>+---------+------------------+------------------+/<code><code>| Id(INT) | RecordDate(DATE) | Temperature(INT) |/<code><code>+---------+------------------+------------------+/<code><code>| 1 | 2015-01-01 | 10 |/<code><code>| 2 | 2015-01-02 | 25 |/<code><code>| 3 | 2015-01-03 | 20 |/<code><code>| 4 | 2015-01-04 | 30 |/<code><code>+---------+------------------+------------------+/<code>

解決方案:DATEDIFF

  • DATEDIFF是計算兩個日期之間的差,用於確保我們將今天的溫度與昨天的溫度進行比較。

簡單來說,查詢是選擇給定日期的溫度高於昨天的溫度的ID。

<code>SELECT DISTINCT a.Id/<code><code>FROM Weather a, Weather b/<code><code>WHERE a.Temperature > b.Temperature/<code><code>AND DATEDIFF(a.Recorddate, b.Recorddate) = 1/<code>
数据科学家常见的五个 SQL 面试问题
数据科学家常见的五个 SQL 面试问题

問題4:部門最高薪資

下面的僱員表中包含所有僱員。每個員工都有一個ID、一個薪水,還有一個部門ID列。

<code>+----+-------+--------+--------------+/<code><code>| Id | Name | Salary | DepartmentId |/<code><code>+----+-------+--------+--------------+/<code><code>| 1 | Joe | 70000 | 1 |/<code><code>| 2 | Jim | 90000 | 1 |/<code><code>| 3 | Henry | 80000 | 2 |/<code><code>| 4 | Sam | 60000 | 2 |/<code><code>| 5 | Max | 90000 | 1 |/<code><code>+----+-------+--------+--------------+/<code>

下面的部門表包含公司的所有部門。

<code>+----+----------+/<code><code>| Id | Name |/<code><code>+----+----------+/<code><code>| 1 | IT |/<code><code>| 2 | Sales |/<code><code>+----+----------+/<code>

編寫SQL查詢來查找每個部門中薪水最高的員工。對於上述兩個表,你的SQL查詢應返回以下行(行的順序無關緊要)。

<code>+------------+----------+--------+/<code><code>| Department | Employee | Salary |/<code><code>+------------+----------+--------+/<code><code>| IT | Max | 90000 |/<code><code>| IT | Jim |90000 |/<code><code>| Sales | Henry | 80000 |/<code><code>+------------+----------+--------+/<code>

解決方案:IN子句

  • IN子句允許你在WHERE語句中使用多個OR子句。例如,WHERE country ='Canada'或country ='USA'與WHERE country IN('Canada','USA')相同。

  • 在這種情況下,我們希望過濾部門表來僅顯示每個部門的最高薪水(即DepartmentId)。然後,我們可以將兩個表連接在一起,其中DepartmentId和Salary在已過濾的Department表中。

<code>SELECT/<code><code>Department.name AS 'Department',/<code><code>Employee.name AS 'Employee',/<code><code>Salary/<code><code>FROM Employee/<code><code>INNER JOIN Department ON Employee.DepartmentId = Department.Id/<code><code>WHERE (DepartmentId , Salary)/<code><code>IN/<code><code>( SELECT/<code><code>DepartmentId, MAX(Salary)/<code><code>FROM/<code><code>Employee/<code><code>GROUP BY DepartmentId/<code><code>)/<code>
数据科学家常见的五个 SQL 面试问题
数据科学家常见的五个 SQL 面试问题

問題5:互換座位

瑪麗是一所中學的老師,她有一張座位表,上面存儲著學生的姓名和相應的座位ID。列ID是連續的增量,瑪麗想為相鄰的學生互換座位。

你可以編寫SQL查詢來輸出瑪麗的結果嗎?

<code>+---------+---------+/<code><code>| id | student |/<code><code>+---------+---------+/<code><code>| 1 | Abbot |/<code><code>| 2 | Doris |/<code><code>| 3 | Emerson |/<code><code>| 4 | Green |/<code><code>| 5 | Jeames |/<code><code>+---------+---------+/<code>

對於樣本輸入,輸出為:

<code>+---------+---------+/<code><code>| id | student |/<code><code>+---------+---------+/<code><code>| 1 | Doris |/<code><code>| 2 | Abbot |/<code><code>| 3 | Green |/<code><code>| 4 | Emerson |/<code><code>| 5 | Jeames |/<code><code>+---------+---------+/<code> 

注意:如果學生人數為奇數,則無需更改最後一個座位。

解決方案:CASE WHEN

  • 可以將CASE WHEN THEN語句視為編碼中的IF語句。

  • 第一條WHEN語句檢查行數是否為奇數,如果行數為奇數,請確保ID號不變。

  • 第二個WHEN語句為每個id加1(例如,1,3,5變為2,4,6)

  • 同樣,第三個WHEN語句將每個id減1(2,4,6變為1,3,5)

<code>SELECT/<code><code>CASE/<code><code>WHEN((SELECT MAX(id) FROM seat)%2 = 1) AND id = (SELECT MAX(id) FROM seat) THENid/<code><code>WHEN id%2 = 1 THEN id + 1/<code><code>ELSE id - 1/<code><code>END AS id, student/<code><code>FROM seat/<code><code>ORDER BY id/<code>

以上就是所有的解決方法,如果有不清楚的地方或其他意見,歡迎評論告訴我們!


分享到:


相關文章: