mysql - SQL - 总和每行中的前 N 个值
问题描述
这是我的 SQL 表。
+-------+------+------+------+------+
| name | q1 | q2 | q3 | q4 |
+-------+------+------+------+------+
| Alex | 5 | 4 | 10 | 7 |
| Brown | 7 | 6 | 4 | 1 |
| Chris | 10 | 10 | 9 | 10 |
| Dave | 8 | 4 | 6 | 0 |
+-------+------+------+------+------+
我想在上面的 SQL 查询中总结每个用户的前 2 个分数。
例如,Alex 的前 2 个分数是10
和7
,所以总和是10 + 7 = 17
我尝试了以下查询:
SELECT NewStudents.name, SUM(q1+q2+q3+q4) FROM NewStudents
GROUP BY NewStudents.name;
将除此q1, q2, q3, q4
查询之外的所有内容求和,而不是q1
对中的q4
前 2 个分数求和。q1
q4
如何在 mySQL 中构造我想要执行的语句?
解决方案
正如评论中@Shadow 中所述..您的数据库需要再次重组..因为这不是数据库工作..您可以像这样重组和进行设计..
+-------+----+--------+
| name | q | point |
+-------+----+--------+
| Alex | 1 | 5 |
| Alex | 2 | 4 |
| Alex | 3 | 10 |
| Alex | 4 | 7 |
| Brown | 1 | 7 |
| Brown | 2 | 6 |
| Brown | 3 | 4 |
| Brown | 4 | 1 |
| Chris | 1 | 10 |
| Chris | 2 | 10 |
| Chris | 3 | 9 |
| Chris | 4 | 10 |
| Dave | 1 | 8 |
| Dave | 2 | 4 |
| Dave | 3 | 6 |
| Dave | 4 | 0 |
+-------+----+--------+
对于查询,您可以这样做:
select
name, sum(point)
from(
select
name, q, point,
ROW_NUMBER() OVER (PARTITION BY name ORDER BY point DESC) as ranked
from newstudents) rankedSD
where
ranked in (1,2)
group by
name
您可以在此处查看演示:
编辑:您可以使用Window Function
. 您可以阅读Row_Number() 函数
推荐阅读
- python - 将 boost::python::numpy::ndarray 作为 boost::python 函数的(默认与否)参数传递?
- java - docker-java 使用 -rm 标志运行容器
- php - 展平多维数组,同时从每个数组中删除一个元素
- linux - 我正在尝试将文件从远程服务器复制到本地计算机
- bash - 从文件中选择模式并将其复制到适当位置的另一个文件
- php - 如何将一个变量的值绑定到php中的另一个变量
- apache-zookeeper - Zookeeper 超时后未恢复
- vue.js - 如何激活 Vue-Cli 4 的源映射?
- javascript - 如果复选框为真,则在文本区域中显示值
- c# - 文化 ID 31770 (0x7C1A) 是中性文化;无法从中创建区域。参数名称:文化