我正在尝试根据两个不同的类别查找第二个最大值。我可以使用镇痛功能或逻辑来获取此信息。我一直在尝试通过逻辑找到这一点。
我的问题是,我正在尝试获取不重复学生在每个国家/地区参加考试第二高的记录。
T1
Exam_ID Student_ID
123 553
123 457
345 563
567 765
678 543
678 543
987 123
678 123
T2
Exam_ID Exam_name Country_name
123 SAT USA
345 CAT USA
567 GRE USA
678 TOEFL UK
987 IELTS UK
222 CBAP UK
这是我到目前为止尝试过的,
select count(distinct T1.Student_ID) count_user,
t2.Country_name,t2.Exam_name
from T1
join T2
on T1.Exam_ID = T2.Exam_ID
group by t2.Exam_name, t2.Country_name
这样做,我可以根据每次考试和所在国家/地区获得唯一的学生人数。
我如何获得基于国家/地区的不重复学生参加考试的第二次最高考试次数?
答案 0 :(得分:1)
我不确定我是否完全理解你的意思。 您能将预期结果与现在得到的结果一起发布吗?
同时,我猜测在英国(最多3名学生)的exam_id 678是最高的结果,而在英国的987是“第二好的结果” ??????
如果是这样,Row_number()可能适合您。请记住,在关系数据库中,row_number通常是一项昂贵的操作,因为它涉及重新分配和排序。根据您要如何处理领带,类似的函数Rank()可能对您更好。语法相似,您可以尝试两者。
尝试如下修改您的查询:
选择计数(区别T1.student_id)计数用户,国家/地区名称,考试名称, row_number()超过(按count_user desc按国家/地区名称划分的分区)作为row_num ...
如果这为您提供了所需的编号,则可以使用qualify子句来限制输出,即 合格row_num = 2
您可能需要将整个内容包装在派生表中,如下所示:
select count_user, country_name, exam_name,
row_number () over (partition by country_name order by count_user desc) as row_num
from (
select count(distinct T1.Student_ID) count_user,
t2.Country_name,t2.Exam_name,
from T1 join T2
on T1.Exam_ID = T2.Exam_ID
group by t2.Exam_name, t2.Country_name
) detail_recs
qualify row_num = 2