如何在GROUP BY查询中仅选择最低总和?

问题描述 投票:0回答:3

我有一个与SQL有关的问题。我有一个数据集,其中包含2列,tasker_ID和working_hours。

列看起来像这样:

tasker_id   working_hours  
   1            30
   2 .          20
   3            14
   1            23
   4            24
   2            39
   3            27
   2            18
   5            0

......我想找出哪个任务工作最少? (我们不会计算完全工作0小时的人)

起初,我用这样的代码来实现这个目的:

select tasker_id, sum(working_hours) as sum_hours
from test.test
group by tasker_id
having sum_hours>0
order by sum_hours;

从订单中,我可以很容易地看到哪些ID具有最少的工作时间,但我想使用Min函数仅显示哪个ID具有最少的工作时间。

这是我的SQL代码:

select tasker_id, min(sum_worked) as min_worked from (
select tasker_id, sum(working_hours) as sum_worked
from test.test
group by tasker_id
having sum_worked>0)a
;

但代码似乎错了,有人可以指导我吗?我知道价值功能以一种方式进行,但我不知道我哪里出错了。或者有人可以直接显示正确的代码?

PS:我正在使用MySQL。

mysql sql
3个回答
0
投票

sum_worked没有在表中定义,这就是为什么他找不到它,因为你在where where条件下使用了。您需要将where条件替换为“has sum_worked> 0”并且在group by语句之后。

或者您可以移动相同的where条件在外部查询中


0
投票

如果您有可用的分析功能,可以尝试:

SELECT tasker_id, sum_worked
FROM
(
    SELECT
        tasker_id, SUM(working_hours) AS sum_worked,
        ROW_NUMBER() OVER (ORDER BY SUM(working_hours)) rn
    FROM test.test
    GROUP BY tasker_id
    HAVING sum_worked > 0
) t
WHERE rn = 1;

如果最低工作小时数达到平局,并且您想要所有关系,您可以用等级函数替换ROW_NUMBER

在支持限制语句的数据库上,假设我们只想要第一个最低的任务器,我们可以将其简化为:

SELECT
    tasker_id, SUM(working_hours) AS sum_worked
FROM test.test
GROUP BY tasker_id
HAVING sum_worked > 0
ORDER BY sum_worked
LIMIT 1;     -- works on MySQL and Postgres

0
投票

问题在于内部查询中的where。你指的是在sum_worked之前执行的where不正确的where子句中的select。而是使用having

select tasker_id, min(sum_worked) as min_worked 
from (
     select tasker_id, sum(working_hours) as sum_worked
     from test.test
     group by tasker_id
     having sum_worked>0
     ) a;
© www.soinside.com 2019 - 2024. All rights reserved.