Среднее значение суммы минус минимум

У меня есть оператор SQL, который собирает оценки по различным типам деятельности (домашнее задание, викторина и т. Д.), И если для этого типа наблюдается самый низкий спад, он падает, иначе он остается. Ниже приведены ошибки и код SQL.

SELECT     Student.firstName, Student.lastName, 'Grades' =
           CASE 
              WHEN Grades.activityType = 'Homework' THEN
                CASE WHEN Policy.drop_hw = 1 THEN
                    (AVG(SUM(Grades.grade) - MIN(Grades.grade))) * (Policy.homework / 100)
                ELSE
                    (AVG(Grades.grade) * (Policy.homework / 100))
                END
            END,  Course.courseNum, Course.sectNum, Grades.activityType

FROM ...

Вот ошибки, которые я получаю:

- Cannot perform an aggregate function on an expression containing an aggregate or a subquery.
- Column 'Policy.drop_hw' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.  

person OneSneakyMofo    schedule 02.12.2010    source источник


Ответы (3)


Изучите аналитические функции. (SO-вопрос, Документация Oracle).

Что-то вроде этого:

AVG(Grades.grade) OVER (PARTITION BY Grades.student_id) AS avg_of_grades

и:

(AVG(SUM(Grades.grade) - MIN(Grades.grade))) OVER (PARTITION BY Grades.student_id) AS avg_grades_with_drop

Установите разбиение на все, что имеет смысл в вашем случае; мы не можем сказать, так как вы пропустили FROM ... в своем примере.

Затем вы можете использовать эти псевдонимы столбцов в любых вычислениях внутри вашего оператора CASE.

person BQ.    schedule 02.12.2010

Если вам нужно сбросить только одну низшую оценку (в случае ничьей)

SELECT  student_id, AVG(grade)
FROM    (
        SELECT  *, ROW_NUMBER() OVER (PARTITION BY student_id ORDER BY grade) rn
        FROM    my_tables
        )
WHERE   NOT (drop_hw = 1 AND rn = 1)
GROUP BY
        student_id

Если вам нужно отбросить все самые низкие оценки:

SELECT  student_id, AVG(grade)
FROM    (
        SELECT  *, MIN(grade) OVER (PARTITION BY student_id) mingrade
        FROM    my_tables
        )
WHERE   NOT (drop_hw = 1 AND grade = mingrade)
GROUP BY
        student_id
person Quassnoi    schedule 02.12.2010

Оператор суммы дает один результат (на группу). Мин-оператор тоже. Итак, что следует агрегировать среднему оператору?

person Dominik Seibold    schedule 02.12.2010
comment
Это хороший момент. Я не думал об этом. Как я могу усреднить сумму и минимум, когда нет общего числа? - person OneSneakyMofo; 02.12.2010
comment
Что ты хочешь делать? Я не понимаю, что вы хотите посчитать. В чем смысл СУММ-МИН? - person Dominik Seibold; 02.12.2010
comment
Хорошо, допустим, это оценки: (100, 100, 100, 90). Если у класса самая низкая оценка, то с помощью sum - min tt будет 390-90, что дает мне 300, тогда я нахожу среднее значение этого числа, но я не могу этого сделать, потому что он не может подсчитать число одно и другое, как вы сказали. - person OneSneakyMofo; 03.12.2010
comment
А как насчет этого: ВЫБРАТЬ СРЕДНЕЕ (значение) ИЗ (ВЫБРАТЬ СУММ (Grades.grade) -MIN (Grades.grade) AS value FROM ...) - person Dominik Seibold; 03.12.2010