如何从sql server中的列中选择多个最大值?
我有以下两个表TBLSession和tblstudenfeerecord,它们有以下示例数据集如何从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:
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;