Я хочу распределить строки в одной таблице по строкам в другой таблице, которые могут одинаково принимать номер строки в SQL оракула - PullRequest
0 голосов
/ 26 февраля 2019

Я пытаюсь написать запрос SQL, который будет распределять записи из одной таблицы в другую с одинаковым номером.

В этом примере у меня есть две таблицы Students и Teachers, и яхочу назначить учеников каждому учителю.

ученики: (Адам, Беннет, Элмер, Джастин, Луи, Ноа, Джек)

Учителя: (Лев, Кайл, Итан)

Примечание:

  1. один ученик не может иметь более одного учителя
  2. каждый учитель должен иметь такое же количество учеников, как и любой другой учитель ...
  3. ..Если количество учеников не является точным кратным числу учителей, в этом случае ученики должны быть как можно более равномерно распределены между учителями

Например, если у нас семь учеников и три учителя,у первых двух учителей будет два ученика, а у последнего - три ученика.

Результат:

Student | Teacher
--------+--------
Adam    | Leo
Bennet  | Leo
Elmer   | Kyle
Justin  | Kyle
Louis   | Ethan
Noah    | Ethan
Jack    | Ethan

Как я могу это сделать в Oracle SQL?

также:если я хочу добавить курсы, и студент долженесть разные учителя в разных принуждениях ... результат:

Student | Teacher | coerces 
--------+---------+---------
Adam    | Leo     |  1
Bennet  | Leo     |  1
Elmer   | Kyle    |  1
Justin  | Kyle    |  1
Louis   | Ethan   |  1
Noah    | Ethan   |  1
Jack    | Ethan   |  1
Louis   | Leo     |  2
Noah    | Leo     |  2
Jack    | Kyle    |  2
Adam    | Kyle    |  2
Bennet  | Ethan   |  2
Elmer   | Ethan   |  2
Justin  | Ethan   |  2

как я могу это сделать?

Ответы [ 2 ]

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

Один метод: количество учеников и учителей.Затем присоединитесь, используя модуль по модулю, где делителем является число учителей:

select
  s.name as student,
  t.name as teacher
from (select name, row_number() over(order by name) as rn from teachers) t
join (select name, row_number() over(order by name) as rn from students) s
  on mod(s.rn - 1, (select count(*) from teachers)) = t.rn -1
order by teacher, student;
0 голосов
/ 26 февраля 2019

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

Если вы хотите получить заказ, вы должны включить уникальный столбец Id как для преподавателей, так и для учащихся.

with tch as
(
 select t.*, row_number() OVER ( ORDER BY name ) as n from teachers t
 ),
ct AS
 ( 
  select count(*) as cnt from Teachers
  )
 select s.name as student,tch.name as teacher from
 (

     SELECT name, NTILE(cnt) OVER (partition by cnt ORDER BY name)  AS n 
         FROM Students cross join
       ct
) s join tch on tch.n = s.n;

Демо

 Student| Teacher 
 -----  | ----
 Adam   | Ethan
 Bennet | Ethan
 Elmer  | Ethan
 Jack   | Kyle 
 Justin | Kyle 
 Louis  | Leo  
 Noah   | Leo 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...