умножить результаты SELECT на значения из другой таблицы - PullRequest
0 голосов
/ 30 октября 2018

У меня есть 3 таблицы с данными учеников из разных школ. Я должен получить количество учеников на школу в одной таблице (готово) и затем использовать заданные вероятности, чтобы выяснить, сколько учеников на множество вероятностей. У меня есть результаты учащихся в школе из другого запроса.

Пример: я использовал запрос, чтобы узнать общее количество учеников в школе "CAA". Если это 198, то распределение вероятностей будет (0,05 * 198, 0,08 * 198, 0,18 * 198, 0,3 * 198, 0,11 * 198, 0,28 * 198). Как мне получить эти значения из указанной таблицы и умножить на результаты?

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

simulated_records:

record_id(PK bigint)   Status(text)    grade(text
 1                     CL              -
 2                     CEC             -
 3                     CEC             -
 4                     CEC             -
 5                     CAA             -
 6                     CAS             -
 7                     CAA             -
 8                     CAA             -
 9                     CAA             -
 10                    CL              -

school_probs:

school_code(PK bigint)  school(text)    probs(numeric)
1                       CAA             {0.05,0.08,0.18,0.3,0.11,0.28}
2                       CAS             {0.06,0.1,0.295,0.36,0.12,0.065}
3                       CBA             {0.05,0.11,0.35,0.32,0.12,0.05}
4                       CL              {0.07,0.09,0.24,0.4,0.06,0.09}

grade_values:

id(PK integer)   score(text)    grade(text
1                95-100         A
2                90-94          A-
3                80-89          B+
4                70-79          B
5                60-69          C
6                0-59           D

МОЙ ЗАПРОС:

SELECT simulated_records.school, COUNT(simulated_records.school) as CountSchool
FROM simulated_records, school_probs
WHERE simulated_records.school = school_probs.school
GROUP BY simulated_records.school;

То, что я должен уметь делать, - это заполнять оценки в таблице смоделированных записей на основе количества учеников в школе и использования вероятностей (которые определяют, сколько детей должно иметь какой класс, используя функцию.

Кроме того, таблица фактических смоделированных записей содержит более 2000 записей.

Ожидаемые результаты. Пустой столбец оценок в simulated_records будет заполнен оценками, основанными на количестве учеников и вероятности из school_probs.

record_id(PK bigint)   Status(text)    grade(text
 1                     CL              A
 2                     CEC             B
 3                     CEC             B
 4                     CEC             A
 5                     CAA             C
 6                     CAS             B
 7                     CAA             D
 8                     CAA             A
 9                     CAA             A
 10                    CL              C

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

демо: дб <> скрипка

SELECT 
    school,
    json_object_agg(gv.grade, s.students)                           -- 4
FROM (
    SELECT 
        s.school, 
        ceil(unnest(sp.probs) * s.students_per_school) students,    -- 2   
        generate_series(1,6) gs                                     -- 3
    FROM (
        SELECT 'CAA'::text as school, 198 as students_per_school    -- 1
    ) s
    JOIN school_probs sp ON s.school = sp.school                      
) s
JOIN grade_values gv ON gv.id = s.gs
GROUP BY school

Результат:

school   json_object_agg
CAA      { "A" : 10, "A-" : 16, "B+" : 36, "B" : 60, "C" : 22, "D" : 56 }

Надеясь, что это ожидаемый результат:

  1. Получение ваших данных откуда-то (смоделируйте вашу таблицу или подзапрос или что-то еще)
    1. unnest расширяет ваш массив numeric probs в одну строку каждого элемента. Это главный трюк
    2. умножьте со своими учениками
    3. ceil округления вверх (в противном случае вы можете сделать floor для округления вниз или round для обычного округления)
  2. generate_series добавляет столбец integer для возможности присоединения к таблице grade_values
  3. Теперь у вас есть по одной строке для каждого класса в школе ( см. Изменить ниже ). Если это ваш ожидаемый результат, то это все. Если вы хотите объединить значения оценок в одну строку для каждой школы, вы можете сделать это json_object_agg

Редактировать: Версия без агрегирования:

SELECT 
    school,
    gv.grade, 
    s.students
FROM (
    SELECT 
        s.school, 
        ceil(unnest(sp.probs) * s.students_per_school) students, 
        generate_series(1,6) gs
    FROM (
        SELECT 'CAA'::text as school, 198 as students_per_school
    ) s
    JOIN school_probs sp ON s.school = sp.school
) s
JOIN grade_values gv ON gv.id = s.gs

Результат:

school   grade   students
CAA      A       10
CAA      A-      16
CAA      B+      36
CAA      B       60
CAA      C       22
CAA      D       56
0 голосов
/ 30 октября 2018

Не уверен, что вы ожидаете в результате, но здесь идет:

select school, factor, CountSchool
from (
      SELECT simulated_records.school, COUNT(simulated_records.school) as CountSchool
      FROM simulated_records, school_probs
      WHERE simulated_records.school = school_probs.school
      GROUP BY simulated_records.school
     ) eq
cross join (
    values 
         (0.05), (0.08), (0.18), (0.3), (0.11), (0.28)
    ) t (factor)

это приведет к такому результату:

    school  factor  count_of
1   CAA 0.0500  198
2   CAA 0.0800  198
3   CAA 0.1800  198
4   CAA 0.3000  198
5   CAA 0.1100  198
6   CAA 0.2800  198

nb: Вы не указали, как будете хранить информацию о факторах.

...