Мы используем следующий SQL-запрос для получения среднемесячных значений. Этот оператор часто используется и работает довольно хорошо, но он терпит неудачу с 'ORA-00979: not a GROUP BY expression' каждый месяц или два, и мы понятия не имеем, почему .
Сначала о процессе:
- у нас необработанные данные каждые несколько минут,
- => необработанные данные усредняются до ежечасных, дневных, месячных и годовых значений
сырые -> ежечасно
- создает записи в таблице средних значений со средним_типом 2
- никогда не будет проблем
ежечасно => ежедневно / ежедневно => ежемесячно / ежемесячно => ежегодно
- Заявления очень похожи
- средние «более низкого» типа усредняются к более высокому типу
Средние типы: 2 часа, 3 дня, (4 недели не используются) 5 ежемесячно и 6 раз в год.
Ошибка появляется только на шаге «ежедневно => ежемесячно».
Запрос:
- Мы не можем воспроизвести ошибку, следующий запуск задания агрегирования обычно проходит без проблем.
- Ошибки возникают каждые 50-60 дней, без реальной закономерности.
- Среда: Oracle 10g
Кто-нибудь знает, в чем может быть проблема?
INSERT INTO averages
SELECT averages_seq.NEXTVAL,
avg.*
FROM (
SELECT
m.city_id, m.city_name,
m.state_id, m.state_name,
m.district_id, m.district_name,
m.country_id, m.country_name,
m.currency_id, m.currency_name,
m.category_id, m.category_name,
5 average_type, -- average_type 5 ==> monthly average
0 analysis_type,
TRUNC(m.average_date, 'MM') average_date,
AVG(m.value) value,
SUM(m.sum) sum,
NULL uncertainty,
NULL uncertainty_type,
MIN(m.value_min) value_min,
MAX(m.value_max) value_max,
SUM(number_of_measurements) number_of_measurements,
-- 6 * 24 => measurements per day
-- (ADD_MONTHS(...)) => days per month
100 * SUM(number_of_measurements) /
(6 * 24 *
(ADD_MONTHS(TRUNC(average_date, 'MM'), 1) - TRUNC(average_date, 'MM'))) coverage_percent,
SUM(customers) customers,
NULL dummy_field,
CURRENT_TIMESTAMP calculation_date,
CURRENT_TIMESTAMP creation_date,
'AGGREGATION' creation_user,
CURRENT_TIMESTAMP modification_date,
'AGGREGATION' modification_user,
'n' constant_1,
3 constant_2,
-1 average_state
FROM averages m
WHERE m.average_type = 3 -- average type 3 ==> daily average
AND m.average_date
BETWEEN
TO_TIMESTAMP('2011-06-01T00:00:00Z', 'YYYY-MM-DD"T"HH24:MI:SS"Z"')
AND
TO_TIMESTAMP('2011-06-30T23:59:59Z', 'YYYY-MM-DD"T"HH24:MI:SS"Z"')
AND m.analysis_type = 0
GROUP BY
m.city_id, m.city_name,
m.state_id, m.state_name,
m.district_id, m.district_name,
m.country_id, m.country_name,
m.currency_id, m.currency_name,
m.category_id, m.category_name,
TRUNC(m.average_date, 'MM')
) avg