如何找出不同列中的两个最高值?

时间:2014-04-03 12:24:11

标签: php mysql sql

我的student_marks表中有各种类型的标记,比如Quiz1Quiz2Quiz3First_MonthlySecond_MonthlyThird_monthly

我创建了一个触发器,用于计算所有标记并在Final_Marks字段中添加总和。

我不希望Final_marks字段添加所有列并对其求和,我只想选择前2 Quiz_Marks和Top2 Monthly_Marks并添加其总和FinalMarks

我在网上搜索并找到greatest关键字,从表中选择最高列值,但在这里我不想要一个值,我需要至少2个最高值来对应每个ID。

-

触发[现在正在添加所有列]

BEGIN
    SET NEW.FinalMarks = NEW.AssignmentMarks + NEW.QuizMarks
                       + NEW.Hourly1 + NEW.Hourly2 + NEW.Hourly3 
                       + NEW.ProjectMarks,

enter image description here

2 个答案:

答案 0 :(得分:1)

如果我理解你的问题是你的问题的解决方案,请使用此代码(此代码用于未知,您可以稍微修改它以适合您想要处理的数据:

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

我希望这会对你有所帮助, 祝你好运

答案 1 :(得分:1)

您有五个值。为了获得最大,你使用GREATEST(当然)。要获得第二个最大值,请执行以下操作:仅为四个值的每个元组找到最大值。当然有五个元组,一个缺少元素1,一个缺少元素2等等。所以你得到的是所有五个中最大值的四倍,一次是第二个最大值。使用至少来获得第二个最大值。那就是它。

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),
)

修改此内容,以便它符合您单独处理Quiz_Marks和Monthly_Marks的请求。