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

时间:2017-11-05 04:38:17

标签: mysql sql

我有一个与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。

3 个答案:

答案 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