Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从sql server中的列中选择多个最大值?_Sql_Sql Server - Fatal编程技术网

如何从sql server中的列中选择多个最大值?

如何从sql server中的列中选择多个最大值?,sql,sql-server,Sql,Sql Server,我有以下两个表TBLSession和tblstudenfeerecord,它们有以下示例数据集 TBLSession: SessionId SessionName SessionStartMonth SessionEndMonth 1 2018-2019 2018-03-24 2019-02-24 2 2019-2020 2019-01-30

我有以下两个表TBLSession和tblstudenfeerecord,它们有以下示例数据集

TBLSession:

   SessionId    SessionName  SessionStartMonth       SessionEndMonth
      1           2018-2019    2018-03-24               2019-02-24
      2           2019-2020    2019-01-30               2019-12-30
      3           2020-2021    2020-01-30               2021-12-30

TBLStudentFeeRecord:
  StudentId     SessionId   TutionFee   BranchId    ClassId   SectionId
    1001                1     1000       1              1         1
    1001                2     2000       1              3         1
    1001                3     1000       2              2         1
现在,我要做的是为被选中的学生选择两个最高的课程辅导费。我可以使用maxcolumnName从该特定列获取一个最大值。现在我怎样才能获得最多两次会话? 查询这些表后需要以下数据集

ResultDataSet:
  StudentId     SessionId   TutionFee   SessionName      

    1001                2     2000       2019-2020            
    1001                3     1000       2020-2021            

要获得上述数据集,查询将是什么?

因为您还没有发布您的尝试,所以请尝试以下内容:

伪查询:

select top 2 from (select TutionFee from TBLStudentFeeRecord 
    where StudentId = 1001
    order by TutionFee desc )

您可以使用max TutionFee和SessionId上的前2个子选项

select a.* , t.TutionFee
from TBLSession a
inner JOIN (
select TOP 2 studentID, TutionFee, SessionId 
from TBLStudentFeeRecord 
where StudentId = 1001
order TutionFee desc, SessionID desc
) t on t.SessionId = a.SessionId  
您可以使用join和TOP来获得它

试试这个:

SELECT StudentId ,SessionId,TutionFee,SessionName 
FROM(
    SELECT TSF.StudentId ,TSF.SessionId,TSF.TutionFee,TS.SessionName
        ,ROW_NUMBER() OVER(PARTITION BY TSF.TutionFee ORDER BY SessionId DESC)RN
    FROM TBLStudentFeeRecord TSF
    INNER JOIN TBLSession TS ON TS.SessionId=TSF.SessionId
    )D
WHERE RN=1
这应该行得通

select TBLStudentFeeRecord.StudentId,  TBLStudentFeeRecord.SessionId, TBLStudentFeeRecord.TutionFee, TBLStudentFeeRecord.SessionName
from TBLStudentFeeRecord
inner join TBLSession on TBLSession.SessionId = TBLStudentFeeRecord.SessionId
where TBLStudentFeeRecord.StudentId =  1000
ORDER BY TBLStudentFeeRecord.TutionFee DESC
LIMIT 2
如果您想获得每个学生的2个会话信息,可以使用with Partition By子句

否则,使用不带Partition By子句的Row_number函数

您可以在以下SQL CTE语句中找到关于两种备选方案的解释

;with cte as (
select *, 
-- top 2 session per student
--  rn = ROW_NUMBER() over (partition by studentid order by sessionid desc)
-- top 2 sessions
    rn = ROW_NUMBER() over (order by sessionid desc)
from TBLStudentFeeRecord
)
select
*
from cte
inner join TBLSession on TBLSession.sessionid = cte.sessionid
where rn <= 2
结果如下


您可以根据自己的要求修改选择列表

如果您面临任何困难或复杂的场景,使用存储过程即可使用通用查询语言

最多两个。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
你试过什么?向我们展示您当前的查询尝试。既然他们都有1000英镑的学费,您是如何决定第三课时而不是第一课时的?如果这真的是您的数据库,你为什么不按课时分组呢?谢谢你的回答,兄弟,但我在问题中提到,我需要询问的是,不是辅导课的最大课时fee@sheikhmuzammil没有会话。最佳答案!!干净整洁!!!非常感谢你救了我一天
;with cte as (
select *, 
-- top 2 session per student
--  rn = ROW_NUMBER() over (partition by studentid order by sessionid desc)
-- top 2 sessions
    rn = ROW_NUMBER() over (order by sessionid desc)
from TBLStudentFeeRecord
)
select
*
from cte
inner join TBLSession on TBLSession.sessionid = cte.sessionid
where rn <= 2
CREATE PROCEDURE twoMaxFrom()
  BEGIN
    DECLARE max1 DOUBLE;
    DECLARE max2 DOUBLE;

    DECLARE emp_cursor CURSOR FOR SELECT
                                    TutionFee
                                  FROM TBLStudentFeeRecord;
    -- 2. Declare NOT FOUND handler
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1;
    -- 3. Open the cursor
    OPEN emp_cursor;
    L: LOOP
      -- 4. Fetch next element
      FETCH emp_cursor
      INTO TutionFee;
      -- Handler will set finished = 1 if cursor is empty
      IF finished = 1
      THEN
        LEAVE L;
      END IF;
      SET max1 = 0;
      SET max2 = 0;
      IF max1 > max2 
      THEN
        SET max1 = TutionFee;
        SET max2 = max1;

      END IF;
    END LOOP;
    -- 5. Close cursor when done
    CLOSE emp_cursor;
    SELECT max1;
    SELECT max2;
  END;