sql - 奇怪的周期性按问题分组(ORA-00979)

标签 sql oracle group-by ora-00979

我们正在使用以下SQL查询来产生每月平均值。该语句使用率很高,并且运行良好,但是每个月或每两个月就会失败,并显示“ ORA-00979:不是GROUP BY表达式”,我们不知道为什么。

首先介绍一下过程:


每隔几分钟我们就会有原始数据,
=>原始数据被平均为每小时,每天,每月和每年的值


原始->每小时


在averages表中使用average_type 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

最佳答案

我可以添加一个分组:

(ADD_MONTHS(TRUNC(average_date, 'MM'), 1)  - TRUNC(average_date, 'MM'))


我知道如果不更改TRUNC(m.average_date, 'MM')则无法更改,但这似乎是GROUP BY之外唯一的非聚合列。

此外,您可以删除内部sql之外的所有非聚合常量列,并显式命名您要插入的列并同时选择这些常量:

例如。

INSERT INTO averages(city_id, city_name, ...average_type, analysis_type, ...)
SELECT averages_seq.NEXTVAL,
avg.city_id, avg.city_name, ...
5, 0, ...


...不能说这部分可以解决问题,但是可以肯定的是,它们不会被汇总。

关于sql - 奇怪的周期性按问题分组(ORA-00979),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6945713/

相关文章:

python - Pandas 数据框按列表分组

c# - 对具有复杂类型的多个属性进行 GroupBy

mysql - GROUP BY 具有时移的日期时间

c# - Oracle触发器——从子表到父表

sql - 创建一个简单的用户界面来访问 Oracle 数据库

oracle - 如何在 sql-loader 中使用 to_number 和 nullif?

sql - 多个日期范围之间的分钟总和

mysql - SQL 表锁定竞争条件 - SELECT 然后 INSERT

SQL:有关 sql 连接的帮助

Python MySQLdb : Update if exists, 否则插入