我有一个具有以下结构的表:

id | workerID | materialID | date | materialGathered


不同的工人每天贡献不同数量的不同材料。一个工人一天只能捐款一次,但不一定每天都可以捐款。

我需要做的是找出其中哪一个效率最高,而哪一个效率最低,而应该将其衡量为每天收集的AVG()材料。

老实说,我不知道该怎么做,所以我将不胜感激。

编辑1:

一些样本数据

1 | 1 | 2013-01-20 | 25
2 | 1 | 2013-01-21 | 15
3 | 1 | 2013-01-22 | 17
4 | 1 | 2013-01-25 | 28
5 | 2 | 2013-01-20 | 23
6 | 2 | 2013-01-21 | 21
7 | 3 | 2013-01-22 | 17
8 | 3 | 2013-01-24 | 15
9 | 3 | 2013-01-25 | 19


老实说,输出的外观并不重要。也许像这样的简单表:

workerID | avgMaterialGatheredPerDay


我真的没有尝试任何事情,因为我真的不知道,哈哈。

编辑2:

将考虑表中的任何时间段(从表的最早日期到最晚日期)。

目前材料无关紧要。在materialGathered列中只有任意单位很重要。

最佳答案

正如您在评论中所说的那样,我们查看每个工作人员并考虑他们平均的日常工作技能,而不是检查给定时间内哪个工作最有效,答案很简单:按工作人员ID分组以获取每个工作人员的结果记录,使用AVG得到他们的平均金额:

select workerid, avg(materialgathered) as avg_gathered
from work
group by workerid;


现在到最好和最坏的工人。这些可以是两个以上。因此,您不仅可以获取第一条记录或最后一条记录,还需要知道avg_gathered的最大值和最小值。

select max(avg_gathered) as max_avg_gathered, min(avg_gathered) as min_avg_gathered
from
(
  select avg(materialgathered) as avg_gathered
  from work
  group by workerid
);


现在,将这两个查询结合起来,以使所有均值最小或最大的工人:

select work.*
from
(
  select workerid, avg(materialgathered) as avg_gathered
  from work
  group by workerid
) as worker
inner join
(
  select max(avg_gathered) as max_avg_gathered, min(avg_gathered) as min_avg_gathered
  from
  (
    select avg(materialgathered) as avg_gathered
    from work
    group by workerid
  )
) as worked on worker.avg_gathered in (worked.max_avg_gathered, worked.min_avg_gathered)
order by worker.avg_gathered;


还有其他方法可以做到这一点。例如,使用HAVING avg(materialgathered) IN (select min(avg_gathered)...) OR avg(materialgathered) IN (select max(avg_gathered)...)代替联接。但是,联接非常有效,因为您只需要选择一个即可选择最小和最大。

关于mysql - 无法找出正确的MySQL查询,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25887489/

10-10 20:21