使用带有两个GROUP BY语句的MAX函数时遇到问题

时间:2013-02-11 10:08:49

标签: sql oracle oracle10g group-by

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

我得到的是每一行中出现的所有天数的MAX值:

max(TIMELENGTH) |   DAY
210.5           |        16
210.5           |        17
210.5           |        27

这是我使用的查询,我做错了什么:

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

谢谢,

2 个答案:

答案 0 :(得分:0)

这可能会给你你想要的东西。

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和小时之间没有加入

答案 1 :(得分:0)

我想你想要这样的东西:

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)

您不想使用to_char(. . . , 'DD'),因为它只返回该月的某一天。

此外,在表达式to_char(trunc(t.create_dt), 'DD')中,trunc()是不必要的。