Второй максимум на основе категории в SQL - PullRequest
1 голос
/ 28 апреля 2019

Я пытаюсь найти второй максимум на основе двух разных категорий. Я могу использовать аналитические функции или логику, чтобы получить это. Я пытался найти это с помощью логики.
Мой вопрос заключается в том, что я пытаюсь получить записи второго наиболее часто сдаваемого экзамена по стране уникальными студентами.

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 Ответ

1 голос
/ 28 апреля 2019

Я не уверен, что полностью понимаю, что вы подразумеваете под своим вопросом.Не могли бы вы опубликовать ожидаемый результат вместе с тем, что вы получаете сейчас?

В то же время, я предполагаю, что exam_id 678 в Великобритании (с 3 студентами) является лучшим результатом и 987 вВеликобритания - «второй по величине результат» ???

Если это так, Row_number () может работать для вас.Имейте в виду, что row_number обычно является дорогостоящей операцией в реляционных базах данных, поскольку включает перераспределение и сортировку.Подобная функция Rank () может быть лучше для вас, в зависимости от того, как вы хотите обрабатывать связи.Синтаксис аналогичен, вы можете попробовать оба варианта.

Попробуйте изменить свой запрос следующим образом:

выберите количество (отличный T1.student_id) count_user, Страна_имя, имя_экзамена, row_number () более (разделить поorder_name страны (count_user desc) as row_num ...

Если это дает требуемую нумерацию, вы можете затем ограничить вывод с помощью предложения qualify, то есть 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
...