leetcode解題思路分析(二十五)178 - 185題

  1. 分數排名
    編寫一個 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;
  1. 最大數
    給定一組非負整數,重新排列它們的順序使之組成一個最大的整數。

本題的核心在於: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;

}
};

  1. 連續出現的數字
    編寫一個 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
;


  1. 超過經理收入的員工
    給定 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
;


  1. 查找重複的電子郵箱
    編寫一個 SQL 查詢,查找 Person 表中所有重複的電子郵箱。

主要使用group和having

# Write your MySQL query statement below
select Email
from Person
group by Email
having count(Email) > 1;
  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
);


  1. 部門工資最高的員工
    編寫一個 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
	)
;


  1. 部門工資前三高的員工
    編寫一個 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
        )
;


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章