Sql 对两个GROUP BY语句使用MAX函数时出现问题

Sql 对两个GROUP BY语句使用MAX函数时出现问题,sql,oracle,oracle10g,group-by,Sql,Oracle,Oracle10g,Group By,我首先做一个子查询,显示按一天中每小时分组的(complete_dt-create_dt)的最大值。然后,我按天分组,因为我想显示每天的最大值(按小时分组的最大值) 我得到的是每行显示的所有天数的最大值: max(TIMELENGTH) | DAY 210.5 | 16 210.5 | 17 210.5 | 27 谢谢你,这可能会给你想要的东西 select max(hours.timele

我首先做一个子查询,显示按一天中每小时分组的(complete_dt-create_dt)的最大值。然后,我按天分组,因为我想显示每天的最大值(按小时分组的最大值)

我得到的是每行显示的所有天数的最大值:

max(TIMELENGTH) | DAY 210.5 | 16 210.5 | 17 210.5 | 27
谢谢你,

这可能会给你想要的东西

select max(hours.timelength) TimeLength, hours.Day   
FROM
 (
 select 
 round(avg(24 * 3600 * (m.complete_dt-m.create_dt)),1) TimeLength,
 TO_CHAR(trunc(t.create_dt), 'DD') Day,
 TRUNC(m.create_dt, 'HH') hours
 from ORDERS m
 where t.order_status_id in (80)
 GROUP BY TRUNC(m.create_dt, 'HH'), TO_CHAR(trunc(t.create_dt), 'DD')
 ) hours  
GROUP BY hours.Day

您最初的查询在t和hours之间没有连接

我想您想要的是:

select max(hours.timelength) as TimeLength, trunc(firstcreate_dt) as DAY   
FROM ORDERS t, 
     (select round(avg(24 * 3600 * (m.complete_dt-m.create_dt)),1) TimeLength,
             min(create_dt) as firstcreate_dt
      from ORDERS m
      where t.order_status_id in (80)
      GROUP BY TRUNC(m.create_dt, 'YYYY-MM-DD HH')
     ) hours  
GROUP BY trunc(firstcreate_dt)
您不想使用
来指定字符(…,'DD')
,因为它只返回月份的日期


另外,在表达式
to_char(trunc(t.create_dt),'DD')
中,不需要
trunc()。但当我运行它时,我会遇到一个错误:FROM关键字未在预期位置找到。(以及第7行[小时前]的最后括号)是用错误突出显示的。我试图修复它,但什么也没有。你知道为什么这一个有效,而另一个无效吗?另一个会进行交叉连接,这意味着如果订单有10000行,你的选择将产生100000000行。你的DBA会对此不满意!无论如何祝你好运。我不明白为什么你每天分组两次。这不应该是多余的吗?谢谢你的回答,它帮了我很多;)如果你把它从内在的微妙表中去掉会发生什么?你不能在外桌按它分组!通常它是多余的,但既然你想在一小时内找到一个平均值,然后在一天内找到一个总和,那么它肯定不是多余的。谢谢,实际上我只需要几天:)这就是为什么要用to_char(…,'DD')。谢谢你的旷课重考,我会把它拿出来的。虽然我看到了你的答案和@ElectricLlama答案之间的区别。他还在子查询中按天分组,我不确定这是否会带来任何差异。@hoesta。两者是等价的。他按天和小时分别分组。我按一个包含天和小时的字段分组(这些字段的性能也应该相同)。该解决方案显式地从子查询中提取日期;这将基于最小创建日期进行计算。这个版本可以,除了月份的几天。在大多数情况下,一个月中只有几天似乎不是正确的方式。
select max(hours.timelength) as TimeLength, trunc(firstcreate_dt) as DAY   
FROM ORDERS t, 
     (select round(avg(24 * 3600 * (m.complete_dt-m.create_dt)),1) TimeLength,
             min(create_dt) as firstcreate_dt
      from ORDERS m
      where t.order_status_id in (80)
      GROUP BY TRUNC(m.create_dt, 'YYYY-MM-DD HH')
     ) hours  
GROUP BY trunc(firstcreate_dt)