SQL中GROUP BY 默認取非聚合的第一條記錄


GROUP BY 分組中的坑

1.分組后select后的字段只能有以下兩種:

  • 出現在group by 后面的字段
  • 使用聚合函數的列

2.group by 默認取非聚合的第一條記錄

 

例題:牛客網數據庫實戰之獲取所有部門中當前員工薪水最高的相關信息

表:dept_emp

表:salaries

 

錯誤的解題方法:

1 select e.dept_no,e.emp_no,max(salary) as maxSalary
2 from dept_emp e
3 inner join salaries s on e.emp_no = s.emp_no
4 group by dept_no
5 order by dept_no 

其中e.emp_no既不是group by后面的字段,也不是使用聚合函數的列,emp_no是非聚合字段,不能出現在SELECT。因為一個聚合字段(dept_no)對應多個非聚合字段(emp_no),所以選擇的時候,會默認選擇非聚合字段中的第一個,於是出錯。

 

顯示錯誤的結果:

 

 因為group by默認取非聚合的第一條記錄,部門d004有兩個員工,分別是1003,1004,由於select后面跟的emp_no既不是group by后面的字段,也不是使用聚合函數的列,因此默認選取了1003,而不是真實的數據1004!!!

 

正確的解題方法:

SELECT de.`dept_no`,de.`emp_no`,s.`salary`
FROM dept_emp de
JOIN salaries s ON de.`emp_no` = s.`emp_no`
AND de.`to_date` = '9999-01-01'
AND s.`to_date` = '9999-01-01'
WHERE s.`salary`=(
    SELECT MAX(salary)
    FROM dept_emp de2
    JOIN salaries s2 ON de2.`emp_no` = s2.`emp_no`
    AND de2.`to_date` = '9999-01-01'
    AND s2.`to_date` = '9999-01-01'
    WHERE de.`dept_no` =de2.`dept_no`
    GROUP BY de2.`dept_no`
)
ORDER BY dept_no

 

注意: 關於為什么一定要兩個表格的時間都限制成規定時間(9999-01-01)

  因為薪水表是按年發的,而題目要查找的當前的薪水,所以要過濾掉以前的階段。即一個領導從入職到現在階段不同,薪水不同,所以to_date為最新,表示最新的薪水

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM