Таблица 1
school_Name Student_Name Class_ID
AMM joe AMM-1-1-1
AMM joe AMM-1-1-2
AMM Adam AMM-1-1-1
AMM Adam AMM-1-1-2
AMM Nancy AMM-1-2-1
AMM Nancy AMM-1-2-2
AMM Albert AMM-1-2-1
AMM Albert AMM-1-2-2
IRB Frank IRB-1-1-1
IRB Frank IRB-1-1-2
IRB Mike IRB-1-1-1
IRB Mike IRB-1-1-2
Здравствуйте, у меня есть аналогичная таблица выше в oracle, и я пытаюсь выбрать уникальный class_id (1st) для первого совпадения имени ученика в этой школе. Может кто-нибудь, пожалуйста, помогите.
Ожидаемый вывод выбранной оценки следующим образом:
Результат
school_Name Student_Name Class_ID
AMM joe AMM-1-1-1
AMM Adam AMM-1-1-2
AMM Nancy AMM-1-2-1
AMM Albert AMM-1-2-2
IRB Frank IRB-1-1-1
IRB Mike IRB-1-1-2
Пробовал ниже, но все еще не работает, как ожидалось.
select
school_name,
student_name,
class_id,
from
(
select
school_name,
student_name,
class_id,
row_number() over (partition by class_id order by student_name ASC) rn
from studentdata_view
) where rn = 1;
То есть вы хотите, чтобы каждый класс появлялся только один раз в выводе? Я думаю, вам нужен более сложный алгоритм для этого. Вот что должно сработать, если в каждом классе только два человека "соперничают", как в вашем примере:
select *
from (
select school_name,student_name, class_id,
dense_rank() over (partition by school_name, class_id order by student_name) rnk,
count(distinct student_name) over (partition by school_name, class_id) cnt,
row_number() over (partition by school_name, student_name order by class_id ) rn
from studentdata_view)
where cnt = 1
or (cnt = 2 and ((rnk = 1 and rn = 1) or (rnk = 2 and rn = 2)))
Результат:
SCHOOL_NAME STUDENT_NAME CLASS_ID RNK CNT RN
----------- ------------ --------- ---------- ---------- ----------
AMM Adam AMM-1-1-1 1 2 1
AMM joe AMM-1-1-2 2 2 2
AMM Albert AMM-1-2-1 1 2 1
AMM Nancy AMM-1-2-2 2 2 2
IRB Frank IRB-1-1-1 1 2 1
IRB Mike IRB-1-1-2 2 2 2
В вашем запросе слишком много запятых:
select
school_name,
student_name,
class_id -- <=== it was here; I removed it
from
(
select
school_name,
student_name,
class_id,
row_number() over (partition by class_id order by student_name ASC) rn
from studentdata_view
) where rn = 1;
Я также изменил full_class_id
на class_id
в вашем разделе по предложению.
Вам нужно изменить раздел по предложению, убрав лишнюю запятую до 1
select school_name,student_name,class_id from
(
select school_name,student_name,class_id, row_number() over (partition by
school_name,student_name order by class_id ASC) rn from studentdata_view
)A where rn = 1;