基于SQL中类别的第二个最大值

时间:2019-04-28 06:18:13

标签: mysql max

我正在尝试根据两个不同的类别查找第二个最大值。我可以使用镇痛功能或逻辑来获取此信息。我一直在尝试通过逻辑找到这一点。
我的问题是,我正在尝试获取不重复学生在每个国家/地区参加考试第二高的记录。

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

这样做,我可以根据每次考试和所在国家/地区获得唯一的学生人数。

我如何获得基于国家/地区的不重复学生参加考试的第二次最高考试次数?

1 个答案:

答案 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