说我在Oracle 11g表中有以下信息:
Qty Production order Date and time
--- ----------------- ---------------
20 00000000000000001 12-JAN-14 00:02
20 00000000000000001 12-JAN-14 00:05
20 00000000000000001 12-JAN-14 00:07
20 00000000000000001 13-JAN-14 00:09
30 00000000000000002 12-JAN-14 00:11
30 00000000000000002 12-JAN-14 00:15
30 00000000000000002 12-JAN-14 00:20
30 00000000000000002 14-JAN-14 00:29
我想编写一个返回以下内容的查询:
Qty Production order First Last
--- ----------------- --------------- ---------------
80 00000000000000001 12-JAN-14 00:02 13-JAN-14 00:09
120 00000000000000002 12-JAN-14 00:11 14-JAN-14 00:29
即,按生产订单分组的数量列的总和,以及每个生产订单的第一个和最后一个记录的日期/时间< / strong>即可。 我想出了一个产生这个结果的查询:
Qty Production order First Last
--- ----------------- --------------- ---------------
80 00000000000000001 12-JAN-14 00:02 14-JAN-14 00:29
120 00000000000000002 12-JAN-14 00:02 14-JAN-14 00:29
这意味着第一个和最后列显示整个表的总体第一个和最后一个日期/时间。 请注意,这是一个虚拟表。抱歉,我现在可以写出我提出的实际查询,因为工作政策不允许我分享。 此外,我尝试使用窗口函数,例如 rank()和 row_number(),但我的用户没有足够的权限来执行此操作。 任何帮助或提示将不胜感激。
答案 0 :(得分:3)
我认为在这种情况下您不需要rank()
或row_number()
(至少在您的示例数据中)。如果我错了,那么你可以提供更合适的例子。无论如何,以下查询返回您需要的内容:
with t as (
select 20 Qty,
'00000000000000001' Production_order,
to_date('12-JAN-14 00:02',
'dd-MON-rr HH24:mi',
'NLS_DATE_LANGUAGE=AMERICAN') Date_and_time
from dual
union all
select 20 Qty,
'00000000000000001' Production_order,
to_date('12-JAN-14 00:05',
'dd-MON-rr HH24:mi',
'NLS_DATE_LANGUAGE=AMERICAN') Date_and_time
from dual
union all
select 20 Qty,
'00000000000000001' Production_order,
to_date('12-JAN-14 00:07',
'dd-MON-rr HH24:mi',
'NLS_DATE_LANGUAGE=AMERICAN') Date_and_time
from dual
union all
select 20 Qty,
'00000000000000001' Production_order,
to_date('13-JAN-14 00:09',
'dd-MON-rr HH24:mi',
'NLS_DATE_LANGUAGE=AMERICAN') Date_and_time
from dual
union all
select 30 Qty,
'00000000000000002' Production_order,
to_date('12-JAN-14 00:11',
'dd-MON-rr HH24:mi',
'NLS_DATE_LANGUAGE=AMERICAN') Date_and_time
from dual
union all
select 30 Qty,
'00000000000000002' Production_order,
to_date('12-JAN-14 00:15',
'dd-MON-rr HH24:mi',
'NLS_DATE_LANGUAGE=AMERICAN') Date_and_time
from dual
union all
select 30 Qty,
'00000000000000002' Production_order,
to_date('12-JAN-14 00:20',
'dd-MON-rr HH24:mi',
'NLS_DATE_LANGUAGE=AMERICAN') Date_and_time
from dual
union all
select 30 Qty,
'00000000000000002' Production_order,
to_date('14-JAN-14 00:29',
'dd-MON-rr HH24:mi',
'NLS_DATE_LANGUAGE=AMERICAN') Date_and_time
from dual)
select sum(Qty) Total_Qty,
Production_order,
min(Date_and_time) First_Date_and_time,
max(Date_and_time) Last_Date_and_time
from t
group by Production_order;
TOTAL_QTY PRODUCTION_ORDER FIRST_DATE_AND_TIME LAST_DATE_AND_TIME
---------- ----------------- ------------------- ------------------
80 00000000000000001 12.01.2014 0:02:00 13.01.2014 0:09:00
120 00000000000000002 12.01.2014 0:11:00 14.01.2014 0:29:00