我有一个与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。
sum_worked没有在表中定义,这就是为什么他找不到它,因为你在where where条件下使用了。您需要将where条件替换为“has sum_worked> 0”并且在group by语句之后。
或者您可以移动相同的where条件在外部查询中
如果您有可用的分析功能,可以尝试:
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
问题在于内部查询中的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;