Oracle中如何用Order by查询数据Group by

How to query Data Group by with Order by in Oracle

我有这样的示例数据

CREATE TABLE table_name (aktif, "START", "END", NO_BOX, QTY) AS
SELECT 1, 'A0001', 'A0020', 2016, 100 FROM DUAL UNION ALL
SELECT 1, 'A0021', 'A0040', 2016, 100 FROM DUAL UNION ALL
SELECT 1, 'A0041', 'A0060', 2016, 100 FROM DUAL UNION ALL
SELECT 0, 'A0061', 'A0080', NULL, 100 FROM DUAL UNION ALL
SELECT 0, 'A0081', 'A0100', NULL, 100 FROM DUAL UNION ALL
SELECT 1, 'A0101', 'A0120', 2016, 100 FROM DUAL UNION ALL
SELECT 1, 'A0121', 'A0140', 2016, 100 FROM DUAL UNION ALL
SELECT 1, 'A0141', 'A0160', 2016, 100 FROM DUAL UNION ALL
SELECT 0, 'A0161', 'A0180', NULL, 100 FROM DUAL UNION ALL
SELECT 0, 'A0181', 'A0200', NULL, 100 FROM DUAL;

我想根据行的顺序对 AKTIFNO_BOX 保持不变的列进行分组,然后 select SUM(QTY)MIN(START), MAX(END).

输出应该是:

AKTIF START END NO_BOX QTY
1 A0001 A0060 2016 300
0 A0061 A0100 NULL 200
1 A0101 A0160 2016 300
0 A0161 A0200 NULL 200

归根结底,这就是差距和孤岛问题。

示例数据:

SQL> with test (aktif, cstart, end, no_box, qty) as
  2    (select 1, 'A0001', 'A0020', 2016, 100 from dual union all
  3     select 1, 'A0021', 'A0040', 2016, 100 from dual union all
  4     select 1, 'A0041', 'A0060', 2016, 100 from dual union all
  5     --
  6     select 0, 'A0061', 'A0080', null, 100 from dual union all
  7     select 0, 'A0081', 'A0100', null, 100 from dual union all
  8     --
  9     select 1, 'A0101', 'A0120', 2016, 100 from dual union all
 10     select 1, 'A0121', 'A0140', 2016, 100 from dual union all
 11     select 1, 'A0141', 'A0160', 2016, 100 from dual union all
 12     --
 13     select 0, 'A0161', 'A0180', null, 100 from dual union all
 14     select 0, 'A0181', 'A0200', null, 100 from dual
 15    ),

查询从这里开始:

 16  temp as
 17    (select t.*,
 18       row_number() over (order by cstart) -
 19       row_Number() over (partition by aktif order by cstart) grp
 20     from test t
 21    )
 22  select aktif,
 23    min(cstart) cstart,
 24    max(end) end,
 25    no_box,
 26    sum(qty) qty
 27  from temp
 28  group by aktif, no_box, grp
 29  order by cstart;

     AKTIF CSTAR END       NO_BOX        QTY
---------- ----- ----- ---------- ----------
         1 A0001 A0060       2016        300
         0 A0061 A0100                   200
         1 A0101 A0160       2016        300
         0 A0161 A0200                   200

SQL>