在分组结果中选择第一个和最后的记录 - Oracle 11G



说我在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

也就是说,由生产订单分组的 QTY 的总和,以及每个生产订单的第一个和最后记录的日期/时间和最后记录。我提出了一个结果,可以得出此结果:

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

这意味着 first last 列显示了整个表格的总体第一个和最后一个日期/时间。请注意,这是一个虚拟表。抱歉,我现在被允许编写我提出的实际查询,因为工作策略不允许我分享。另外,我尝试使用窗口功能,例如 rank() and row_number(),但是我的用户没有足够的特权来执行此操作。任何帮助或提示都将不胜感激。

我认为在这种情况下您不需要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

相关内容

  • 没有找到相关文章

最新更新