MySQL медиана с объединением между 3 таблицами - PullRequest
0 голосов
/ 29 мая 2020

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

Мой запрос сейчас такой:

SELECT
    dd.id,
    AVG(dd.score) as median_val
FROM (
SELECT d.id, d.score, @rownum := @rownum + 1 as row_number, @total_rows := @rownum
FROM (
        SELECT
            teacher.id,
            submission.id AS submission_id,
            submission.score
        FROM teacher
        LEFT JOIN course_work ON teacher.id = course_work.teacher_id
        LEFT JOIN submission ON course_work.id = submission.course_work_id
        ORDER BY teacher.id
) d, (SELECT @rownum := 0) r
WHERE d.score is NOT NULL
ORDER BY d.score
) as dd
WHERE dd.row_number IN (FLOOR((@total_rows + 1) / 2), FLOOR((@total_rows + 2) / 2))
GROUP BY dd.id;

Большое спасибо.

Схема SQL следующая:

https://pastebin.com/RT9iWJPH

1 Ответ

0 голосов
/ 30 мая 2020

Это может дать результат, который вы ищете. Не могли бы вы проверить это на своих данных.

SELECT
    t.id as teacherid,
    t.full_name teacherfullname,
    COUNT(*) AS total_rows,
IF
    (
        count(*)% 2 = 1,
        CAST(
            SUBSTRING_INDEX(
                SUBSTRING_INDEX(
                    GROUP_CONCAT( s.score ORDER BY s.score SEPARATOR ',' ),
                    ',',
                50 / 100 * COUNT(*)),
                ',',
                - 1 
            ) AS DECIMAL 
        ),
        ROUND((
                CAST(
                    SUBSTRING_INDEX(
                        SUBSTRING_INDEX( GROUP_CONCAT( s.score ORDER BY s.score SEPARATOR ',' ), ',', 50 / 100 * COUNT(*) + 1 ),
                        ',',
                        - 1 
                    ) AS DECIMAL 
                    ) + CAST(
                    SUBSTRING_INDEX(
                        SUBSTRING_INDEX(
                            GROUP_CONCAT( s.score ORDER BY s.score SEPARATOR ',' ),
                            ',',
                        50 / 100 * COUNT(*)),
                        ',',
                        - 1 
                    ) AS DECIMAL 
                )) / 2 
        )) AS median 
FROM
    teacher t
    JOIN course_work cw ON cw.teacher_id = t.id
    JOIN submission s ON cw.id = s.course_work_id 
WHERE
    s.score IS NOT NULL 
GROUP BY
    teacherid 
ORDER BY
    s.score
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...