我有一个与SQL相关的问题。我有一个数据集,其中包含2列,tasker_ID和working_hours。
列看起来像这样:
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
@IBOutlet weak var tableview: UITableView!
@IBOutlet weak var textField: UITextField?
var names = ["Jack", "Andy", "Guy", "Bruce", "Nick", "James", "Dominick"]
// MARK: tableview delegate methods
public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return names.count
}
public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: "Cell")
cell.textLabel?.text = names[indexPath.row]
return cell
}
// MARK: ibactions
@IBAction func addButton(_ sender: Any) {
let name : String = textField!.text!
names.append(name)
textField?.text! = ""
tableview.reloadData()
}
}
... 我想找出哪个任务工作最少? (我们不会计算完全工作0小时的人)
首先,我使用此类代码来实现此目的:
tasker_id working_hours
1 30
2 . 20
3 14
1 23
4 24
2 39
3 27
2 18
5 0
从订单中,我可以轻松查看哪些ID的工作时间最短,但我想使用Min功能仅显示哪个ID的工作时间最短。
这是我的SQL代码:
select tasker_id, sum(working_hours) as sum_hours
from test.test
group by tasker_id
having sum_hours>0
order by sum_hours;
但代码似乎不对,有人可以指导我吗?我知道价值功能以一种方式进行,但我不知道我哪里出错了。或者有人可以直接显示正确的代码?
PS:我正在使用MySQL。
答案 0 :(得分: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;
答案 1 :(得分:0)
sum_worked没有在表中定义,这就是为什么他找不到它,因为你在where where条件下使用了。 你需要用where“sum_worked> 0”替换where条件,并在group by语句之后。
或者您可以将条件移动到外部查询中的条件
答案 2 :(得分: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