2013-02-11 93 views
0

我首先创建一个子查询,以显示按每天​​HOUR分组的最大值(complete_dt-create_dt)。然后,我每天都进行分组,因为我想显示每天最大值(按小时分组)。使用MAX函数和两个GROUP BY语句时遇到问题

我得到的是所有天数的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') 

谢谢,

+0

您没有加入这两个表格。 – Taryn 2013-02-11 10:18:44

回答

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和小时

+0

嗯,非常感谢。当我运行它时,我遇到了一个错误:FROM关键字找不到预期的地方。 (并且第7行的最后一个括号[小时前]突出显示了错误,我试图修复它,但没有任何内容 – Honesta 2013-02-11 10:29:13

+0

oh .. extra paranthesis。 – 2013-02-11 10:33:28

+0

yes我修复了它,结果看起来很好,非常感谢。 – Honesta 2013-02-11 10:39:49

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()是不必要的。

+0

谢谢,实际上我只需要几天:)那就是为什么to_char(...,'DD')。谢谢trunc redudancy,我会把它拿出来。虽然我看到你的答案和@ElectricLlama答案有所不同。他还通过子查询中的Days进行分组,我不确定这是否会带来任何差异。 – Honesta 2013-02-12 08:21:37

+0

@hoesta。 。 。这两个是相同的。他分别按天和小时分组。我把一个字段分成几天和几小时(这些字段也应该具有相同的性能)。该解决方案明确从子查询中提取日期;这根据最小创建日期来计算它。该版本没有问题,但月份除外。在几个月的日子里,似乎并不是大多数情况下的正确方法。 – 2013-02-12 14:06:15