Php 如何从不同的列中找出两个最高值?
我的Php 如何从不同的列中找出两个最高值?,php,mysql,sql,Php,Mysql,Sql,我的学生评分表中有各种类型的评分,比如Quiz1,Quiz2,Quiz3,第一个月,第二个月,第三个月 我创建了一个触发器,用于计算所有标记,并在Final_marks字段中添加总和 我不想让Final\u marks字段添加所有列并求和,我只想选择前2名quick\u marks和前2名Monthly\u marks并在FinalMarks中添加它们的和 我在网上搜索并找到了从表中选择最高列值的grest关键字,但这里我不想要一个值,我需要每个ID至少有两个最高值 - Trigger[现在它正
学生评分表中有各种类型的评分,比如Quiz1
,Quiz2
,Quiz3
,第一个月
,第二个月
,第三个月
我创建了一个触发器,用于计算所有标记,并在Final_marks
字段中添加总和
我不想让Final\u marks
字段添加所有列并求和,我只想选择前2名quick\u marks
和前2名Monthly\u marks
并在FinalMarks
中添加它们的和
我在网上搜索并找到了从表中选择最高列值的grest
关键字,但这里我不想要一个值,我需要每个ID至少有两个最高值
-
Trigger[现在它正在添加所有列]
BEGIN
SET NEW.FinalMarks = NEW.AssignmentMarks + NEW.QuizMarks
+ NEW.Hourly1 + NEW.Hourly2 + NEW.Hourly3
+ NEW.ProjectMarks,
如果我理解了您的问题,这里是您问题的解决方案,请使用此代码(此代码用于不理解您可以稍微修改它以适合您想要处理的数据:
DECLARE @v_type1 INT = 0
,@v_type2 INT = 0
,@v_type3 INT = 0;
WITH temp AS (
select 1 typeid, 12 note union all
select 1 typeid, 11 note union all
select 1 typeid, 13 note union all
select 2 typeid, 18 note union all
select 2 typeid, 19 note union all
select 2 typeid, 19 note union all
select 3 typeid, 21 note)
select
@v_type1 = @v_type1
+ISNULL(CASE WHEN typeid = 1 AND ROW_NUMBER() over (partition by typeid ORDER BY note DESC)<=2
THEN note
ELSE 0
END,0)
,@v_type2 = @v_type2
+ISNULL(CASE WHEN typeid = 2 AND ROW_NUMBER() over (partition by typeid ORDER BY note DESC)<=2
THEN note
ELSE 0
END,0)
,@v_type3 = @v_type3
+ISNULL(CASE WHEN typeid = 3 AND ROW_NUMBER() over (partition by typeid ORDER BY note DESC)<=2
THEN note
ELSE 0
END,0)
from temp
SELECT @v_type1,@v_type2,@v_type3
声明@v_type1 INT=0
,@v_type2 INT=0
,@v_type3 INT=0;
临时工(
选择1个typeid,12个音符union all
选择1个typeid,11个note union all
选择1个typeid,13个注释union all
选择2个typeid,18个音符union all
选择2个typeid,19个注释union all
选择2个typeid,19个注释union all
选择3个typeid,21个注释)
选择
@v_type1=@v_type1
+ISNULL(当typeid=1且行数()超过(按typeid按note DESC排序)时的情况)您有五个值。要获得最大值,您可以使用最大值(当然)。要获得第二个最大值,请执行以下操作:为只有四个值的每个元组查找最大值。当然,有五个元组,一个缺少元素1,一个缺少元素2,等等。因此,您得到的值是所有五个元组中最大值的四倍,另一个是第二个最大值的一倍。使用least获得第二个最大值。就是这样
SET NEW.FinalMarks =
GREATEST(new.quizmarks, new.hourly1, new.hourly2, new.hourly3, new.projectmarks)
+
LEAST
(
GREATEST(new.quizmarks, new.hourly1, new.hourly2, new.hourly3),
GREATEST(new.quizmarks, new.hourly1, new.hourly2, new.projectmarks),
GREATEST(new.quizmarks, new.hourly1, new.hourly3, new.projectmarks),
GREATEST(new.quizmarks, new.hourly2, new.hourly3, new.projectmarks),
GREATEST(new.hourly1, new.hourly2, new.hourly3, new.projectmarks),
)
修改此项,使其满足您的要求,分别处理测验分数和月度分数。1.规范化您的设计+1对不起,我在吃我的单词时,它不是规范化了吗?如果我进一步划分学生分数
表,那么每次用户更新分数时,可能很难更新最终分数
列。