在分组结果中选择第一条和最后一条记录 - Oracle 11g

Posted

技术标签:

【中文标题】在分组结果中选择第一条和最后一条记录 - Oracle 11g【英文标题】:Select first and last records in grouped results - Oracle 11g 【发布时间】:2014-02-13 02:46:51 【问题描述】:

假设我在一个 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 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

这意味着 FirstLast 列显示整个表格的总体第一个和最后一个日期/时间。 请注意,这是一个虚拟表。抱歉,我现在可以写出我提出的实际查询,因为工作政策不允许我分享它。 此外,我尝试了诸如 rank()row_number() 之类的窗口函数,但我的用户没有足够的权限这样做。 任何帮助或提示将不胜感激。

【问题讨论】:

用户怎么能没有内置函数的权限呢?无论如何,如果您显示当前查询,调整它可能很简单;自从您的 qty 看起来正确以来,您似乎已经在正确的级别进行分组,所以我很好奇您是如何获得这些日期范围的。特别是不使用窗口函数。 【参考方案1】:

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

【讨论】:

我的工作就像一个魅力!非常感谢你!有什么推荐的读物来深入了解 Oracle 11g? (另外,一般的 SQL) @gacanepa 我很高兴我的查询很有帮助,那么请接受它作为答案。对于 Oracle,我个人会推荐 Tom Kyte 的一本书。就 SQL 而言,一般有 Martin Gruber 的 good reading。

以上是关于在分组结果中选择第一条和最后一条记录 - Oracle 11g的主要内容,如果未能解决你的问题,请参考以下文章

如何使用聚合函数在 MySQL 查询中获取分组记录的第一条和最后一条记录?

MySQL从一系列相同的值中选择第一条和最后一条记录

mysql中如何查询表的第一条和最后一条记录

如何从 sql 查询中获取第一条和最后一条记录?

获取表中存在的每个日期的第一条和最后一条记录号

postgresql某数据表中有多天的记录存在,我想取某天的第一条和最后一条记录,数据库查询语句怎么写