hax*_*ney 7 sql database aggregate-functions aggregation
我有一个包含两列的表:一对id和一对"标记".我想要一个结果,列出x每个值的标记或更多的夫妇的数量x.所以我的输入看起来像:
| couple_id | num_marks | |-----------+-----------| | 9 | 7 | | 6 | 6 | | 8 | 6 | | 2 | 5 | | 3 | 4 | | 5 | 4 | | 1 | 3 | | 4 | 3 | | 10 | 2 | | 7 | 1 |
我想得到结果:
| num_marks | num_couples | |-----------+-------------| | 7 | 1 | | 6 | 3 | | 5 | 4 | | 4 | 6 | | 3 | 8 | | 2 | 9 | | 1 | 10 |
即有一对夫妇有7个或更多的分数,3对夫妇有6个或更多分数,4对夫妇有5个或更多分数等等.我已经能够提出一个查询来返回具有正确 n分数的夫妇数量:
SELECT num_marks,
count(couple_id) AS num_couples
FROM table_name
GROUP BY num_marks
ORDER BY num_marks DESC;
Run Code Online (Sandbox Code Playgroud)
产量:
| num_marks | num_couples | |-----------+-------------| | 7 | 1 | | 6 | 2 | | 5 | 1 | | 4 | 2 | | 3 | 2 | | 2 | 1 | | 1 | 1 |
即有一对夫妇有7个标记,2对夫妇有6个标记,1个有5个,等等.是否有一种方便的方法可以有效地将每行的值与上面的值相加?我可以在应用程序级别执行此操作,但它似乎真正属于数据库中的那种东西.
这可能不是特别有效,但应该完成工作:
SELECT t1.num_marks,
(SELECT count(t2.couple_id)
FROM table_name t2
WHERE t2.num_marks >= t1.num_marks
) AS num_couples
FROM table_name t1
GROUP BY t1.num_marks
ORDER BY t1.num_marks DESC;
Run Code Online (Sandbox Code Playgroud)
编辑: 您可以在查询的select,from,where,group by和having子句中使用子查询,如果引用main/outer'query',那么它将评估每行的子查询,然后知道作为相关子查询.(因此关于表现的警告)
根据Damien的回答,你也可以使用CTE - CTE可以提高可读性,并且使IMO的递归和自连接变得更加容易.
大多数SQL都支持AFAIK子查询.