- 分數排名
編寫一個 SQL 查詢來實現分數排名。
如果兩個分數相同,則兩個分數排名(Rank)相同。請注意,平分後的下一個名次應該是下一個連續的整數值。換句話說,名次之間不應該有“間隔”。
MySQL常用窗口函數有rank, dense_rank, row_number, 區別在於第一個對同樣數據會並列排行,後面的會+n,而第二個則只會+1,第三個就單純順序排行,沒有並列關係
# Write your MySQL query statement below
select score,
dense_rank() over(order by Score desc) as 'Rank'
from Scores;
- 最大數
給定一組非負整數,重新排列它們的順序使之組成一個最大的整數。
本題的核心在於:bool cmp(string s1, string s2){s1+s2 > s2+s1}
bool cmp(string a, string b)//直接相加比較
{
return a+b > b+a;
}
class Solution {
public:
string largestNumber(vector<int>& nums) {
vector<string>v;
for (int i = 0; i < nums.size(); i++)
{
string temp = to_string(nums[i]);//比用stringstream要快很多!
v.push_back(temp);
}
sort(v.begin(), v.end(), cmp);
string ret;
for (int i = 0; i < v.size(); i++)
{
ret += v[i];
if (v[0] == "0")//考慮全零的情況
break;
}
return ret;
}
};
- 連續出現的數字
編寫一個 SQL 查詢,查找所有至少連續出現三次的數字。
1. 使用Logs並檢查是否連續3次 2. 我們需要添加關鍵字 DISTINCT ,因爲如果一個數字連續出現超過 3 次,會返回重複元素。
# Write your MySQL query statement below
SELECT DISTINCT
l1.Num AS ConsecutiveNums
FROM
Logs l1,
Logs l2,
Logs l3
WHERE
l1.Id = l2.Id - 1
AND l2.Id = l3.Id - 1
AND l1.Num = l2.Num
AND l2.Num = l3.Num
;
- 超過經理收入的員工
給定 Employee 表,編寫一個 SQL 查詢,該查詢可以獲取收入超過他們經理的員工的姓名。在上面的表格中,Joe 是唯一一個收入超過他的經理的員工。
使用join完成
# Write your MySQL query statement below
SELECT
a.NAME AS Employee
FROM Employee AS a JOIN Employee AS b
ON a.ManagerId = b.Id
AND a.Salary > b.Salary
;
- 查找重複的電子郵箱
編寫一個 SQL 查詢,查找 Person 表中所有重複的電子郵箱。
主要使用group和having
# Write your MySQL query statement below
select Email
from Person
group by Email
having count(Email) > 1;
- 從不訂購的客戶
使用關鍵詞NOT IN
# Write your MySQL query statement below
select customers.name as 'Customers'
from customers
where customers.id not in
(
select customerid from orders
);
- 部門工資最高的員工
編寫一個 SQL 查詢,找出每個部門工資最高的員工。例如,根據上述給定的表格,Max 在 IT 部門有最高工資,Henry 在 Sales 部門有最高工資。
使用 JOIN 和 IN 語句
# Write your MySQL query statement below
SELECT
Department.name AS 'Department',
Employee.name AS 'Employee',
Salary
FROM
Employee
JOIN
Department ON Employee.DepartmentId = Department.Id
WHERE
(Employee.DepartmentId , Salary) IN
( SELECT
DepartmentId, MAX(Salary)
FROM
Employee
GROUP BY DepartmentId
)
;
- 部門工資前三高的員工
編寫一個 SQL 查詢,找出每個部門獲得前三高工資的所有員工。
# Write your MySQL query statement below
SELECT
d.Name AS 'Department', e1.Name AS 'Employee', e1.Salary
FROM
Employee e1
JOIN
Department d ON e1.DepartmentId = d.Id
WHERE
3 > (SELECT
COUNT(DISTINCT e2.Salary)
FROM
Employee e2
WHERE
e2.Salary > e1.Salary
AND e1.DepartmentId = e2.DepartmentId
)
;