Выберите уникальные значения двух разных столбцов из повторяющихся строк в Oracle - PullRequest
0 голосов
/ 05 февраля 2019

Таблица 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;

Ответы [ 3 ]

0 голосов
/ 05 февраля 2019

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

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 голосов
/ 05 февраля 2019

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

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 demo

Результат:

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 голосов
/ 05 февраля 2019

Вам нужно поменять свой раздел по предложению, убрал лишнюю запятую перед 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...