【问题标题】:How to select the employee who worked the longest hours on project如何选择在项目上工作时间最长的员工
【发布时间】:2013-09-30 00:39:54
【问题描述】:

我有以下分配表:

+-----------+----------------+-------------+
| ProjectID | EmployeeNumber | HoursWorked |
+-----------+----------------+-------------+
|      1000 |              1 |       30.00 |
|      1000 |              8 |       75.00 |
|      1000 |             10 |       55.00 |
|      1100 |              4 |       40.00 |
|      1100 |              6 |       45.00 |
|      1200 |              1 |       25.00 |
|      1200 |              2 |       20.00 |
|      1200 |              4 |       45.00 |
|      1200 |              5 |       40.00 |
|      1300 |              1 |       35.00 |
|      1300 |              8 |       80.00 |
|      1300 |             10 |       50.00 |
|      1400 |              4 |       15.00 |
|      1400 |              5 |       10.00 |
|      1400 |              6 |       27.50 |
+-----------+----------------+-------------+

在下表中,我找到了超出预算的两个项目,但我必须找到每个项目工作时间最长的人的员工编号:

CREATE VIEW OVER AS
    SELECT P.Department, P.ProjectID, A.EmployeeNumber, A.HoursWorked   
    FROM project AS P JOIN assignment AS A
    ON P.ProjectID = A.ProjectID
    GROUP BY P.ProjectID
    HAVING MAX(P.maxhours) < SUM(A.hoursworked);

+------------+-----------+----------------+-------------+
| Department | ProjectID | EmployeeNumber | HoursWorked |
+------------+-----------+----------------+-------------+
| Marketing  |      1000 |              1 |       30.00 |
| Marketing  |      1300 |              1 |       35.00 |
+------------+-----------+----------------+-------------+

两个项目的正确员工编号应为 8 以及 75 和 80 小时。

知道如何检索这些单个项目的 MAX 工作时间吗?

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    简单的方法是这样的:

    select * from (
        select ProjectID, EmployeeNumber
        from assignment
        group by 1, 2
        order by sum(HoursWorked) desc
    ) x
    group by 1
    

    请参阅 SQLFiddle 上的 live demo

    这是因为 mysql 对 group by 的特殊处理,它不允许列出所有非聚合列,并且在这种情况下只返回每个组遇到的第一行。

    【讨论】:

    • 效果很好,但我想用真实的员工编号替换原始表格中的“EmployeeNumber”列。
    • 您所说的“真实”员工人数是什么意思?
    • 您的答案检索到的员工编号。应该是 8 和 8,而不是 1 和 1。
    • 我不明白你的意思。使用您的数据和我的查询,我得到 8 和 8。看到它在工作 here。我还添加了答案的链接。
    • '...在这种情况下,只返回每个组遇到的第一行' - 没有记录如此,因此不是不仅仅是观察,这意味着行为可能会在未来的版本中发生变化。
    猜你喜欢
    • 2013-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-01
    • 2021-12-15
    • 2021-10-19
    • 1970-01-01
    • 2012-01-05
    相关资源
    最近更新 更多