Выберите уникальные значения двух разных столбцов из повторяющихся строк в Oracle

0

Таблица 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;
  • 1
    Что значит "не работает, как ожидалось"? Вы получили неправильный результат? Безрезультатно? Сообщение об ошибке? Головные боли?
  • 2
    Какую СУБД вы используете? MySQL или Oracle? Это разные продукты.
Показать ещё 1 комментарий
Теги:
database
oracle11g

3 ответа

0

То есть вы хотите, чтобы каждый класс появлялся только один раз в выводе? Я думаю, вам нужен более сложный алгоритм для этого. Вот что должно сработать, если в каждом классе только два человека "соперничают", как в вашем примере:

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)))

демо-версия dbfiddle

Результат:

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
  • 0
    привет спасибо за помощь в каждом классе может быть более двух учеников, «конкурирующих», максим может быть 62 повторения, тогда да, каждый класс должен появляться только один раз, когда «student_name» и «class_id» должны быть уникальными, ни один из них не должен повторяться в выходных данных.
0

В вашем запросе слишком много запятых:

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 в вашем разделе по предложению.

0

Вам нужно изменить раздел по предложению, убрав лишнюю запятую до 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;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню