簡體   English   中英

MySQL - SELECT MAX(),並獲取對應的字段

[英]MySQL - SELECT MAX(), and get corresponding fields

任務是:獲取每個員工的 ID 和他工作的最后一個部門的 ID 的列表。 這變得越來越復雜,因為一個人可以同時在不同的部門工作,所以我們需要讓他的最后一個部門擁有最大的比率。

桌子:

 ID_employee| ID_department | end_date  |   rate
 1            22              2016-01-01    1
 2            25              NULL          0.3
 2            27              NULL          1
 3            22              2013-12-12    0.5
 3            22              2014-05-05    0.5

end_date是員工工作的最后一天,NULL 值表示他的合同是今天生效的。

結果必須如下所示:

ID_employee | ID_department | end_date  |   rate
1             22              2016-01-01    1
2             27              NULL          1
3             22              2014-05-05    0.5

我發現了如何使用 join 選擇帶有相應字段的 max():

SELECT table.id_employee, id_department
FROM table
JOIN (  SELECT id_employee,
    IF (MAX( end_date IS NULL ) = 1 , "0000-00-00",  MAX( end_date )) as max_end_date
    FROM table GROUP BY id_employee) maxs ON maxs.id_employee = table.id_employee
WHERE maxs.max_end_date = IFNULL(table.end_date, "0000-00-00")
GROUP BY table.id_employee

但是,結果中有所有相應的行:

ID_employee | ID_department | end_date  |   rate
1             22              2016-01-01    1
2             25              NULL          0.3
2             27              NULL          1
3             22              2014-05-05    0.5

問題是,如何不僅獲得與 MAX(end_date) 對應的行,還獲得 MAX(rate) 的對應行? 我認為 HAVING 可能會有所幫助,但我仍然不知道那里必須有什么。

也許還有其他方法可以更好地解決問題,因為這個查詢大約需要 16 秒,而表有大約 30 000 行。

你可以試試下面的查詢:

SELECT  T1.ID_employee,  
        T1.ID_department, 
        CASE WHEN maxs.max_end_date = "0000-00-00" THEN NULL ELSE maxs.max_end_date END AS end_date, 
        T1.rate
FROM TestTable T1
JOIN (  SELECT  id_employee,
                MAX(ID_department) AS ID_department,
                IF (MAX( end_date IS NULL ) = 1, "0000-00-00",  MAX( end_date )) AS max_end_date
        FROM TestTable 
        GROUP BY id_employee ) maxs ON maxs.id_employee = T1.id_employee AND maxs.ID_department = T1.ID_department
WHERE maxs.max_end_date = IFNULL(T1.end_date, "0000-00-00")
GROUP BY T1.id_employee

請找到Live Demo

更新:

根據評論,以下查詢有助於實現結果:

SET @CurrentDate := CURDATE();

SELECT T2.ID_employee, 
       T2.ID_department, 
       CASE WHEN MR.Max_end_date = @CurrentDate THEN NULL ELSE T2.end_date END AS end_date, 
       MR.MaxRate AS rate
FROM TestTable T2 
JOIN (
    SELECT T1.ID_employee, MAX(T1.rate) AS MaxRate, MD.Max_end_date
    FROM TestTable T1
    JOIN (
        SELECT  ID_employee,
                MAX(CASE WHEN end_date IS NULL THEN @CurrentDate ELSE end_date END) AS Max_end_date
        FROM TestTable 
        GROUP BY ID_employee
        ) MD ON MD.ID_employee = T1.ID_employee
    WHERE MD.Max_end_date = IFNULL(T1.end_date, @CurrentDate)
    GROUP BY T1.ID_employee
) MR ON MR.ID_employee = T2.ID_employee AND MR.MaxRate = T2.rate 
WHERE MR.Max_end_date = IFNULL(T2.end_date, @CurrentDate)

Working Demo

我認為這個查詢對你有用。

SELECT ID_employee, ID_department, end_date, MAX(rate)
 FROM test_max
 GROUP BY ID_employee

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM