ORACLE查询使用MIN根据ID消耗的数量获取最后一个ID

时间:2017-09-05 10:45:09

标签: oracle

我使用Oracle获得Incoming Stock交易数据:

ID   | DESCRIPTION | PART_NO | QUANTITY | DATEADDED
TR5  | FG          | P0025   | 5        | 06-SEP-2017 08:20:33 <-- just now added

TR4  | Test        | TEST1   | 8        | 05-SEP-2017 15:11:15
TR3  | FG          | GSDFGSG | 10       | 31-AUG-2017 16:26:04
TR2  | FG          | GSDFGSG | 2        | 31-AUG-2017 16:05:39
TR1  | FG          | GSDFGSG | 2        | 30-AUG-2017 16:30:16

现在我将这些数据分组为:

TR_ID | PART_NO | TOTAL
TR1   | GSDFGSG | 14
TR4   | TEST1   | 8
TR5   | P0025   | 5 <-- just now added

查询代码:

SELECT MIN(TRANSACTION_EQUIPMENTID) as TR_ID,
PART_NO,
SUM(T.QUANTITY) AS TOTAL
FROM WA_II_TBL_TR_EQUIPMENT T
GROUP BY T.PART_NO

正如您在该数据和查询代码中看到的那样,我使用MIN显示TR_ID以获得第一笔交易的第一个ID。

现在我有外发交易数据:

假设我尝试获得数量8

ID_FK | QUANTITY
TR1   | 8

现在我想获得最后一个ID,因为已经消耗了数量

ID | DESCRIPTION | PART_NO | QUANTITY
TR3| FG          | GSDFGSG | 10  <-- CONSUMED 4+2+2, TOTAL 8
TR2| FG          | GSDFGSG | 2   <-- CONSUMED 2+2, TOTAL 4
TR1| FG          | GSDFGSG | 2   <-- CONSUMED 2

如上所示,TR1,TR2已被消耗。现在我想要查询

SELECT MIN(TRANSACTION_EQUIPMENTID) as TR_ID,
PART_NO,
SUM(T.QUANTITY) AS TOTAL
FROM WA_II_TBL_TR_EQUIPMENT T
GROUP BY T.PART_NO

获得最后一个ID是:TR3,由于TR1&amp; TR2已被消耗。

如何在查询中执行此操作?

1 个答案:

答案 0 :(得分:2)

在增长金额大于8的情况下,取最小值id。使用分析sum()

select min(id) id
  from (select t.*,               
               sum(quantity) over (partition by part_no order by id) sq
          from t
          where part_no = 'GSDFGSG' 
          ) 
  where sq >= 8 

测试数据,输出:

create table t(ID varchar2(3), DESCRIPTION varchar2(5), 
    PART_NO varchar2(8), QUANTITY number(5), DATEADDED date);

insert into t values ('TR4', 'Test', 'TEST1',    8, timestamp '2017-09-05 15:11:15');
insert into t values ('TR3', 'FG',   'GSDFGSG', 10, timestamp '2017-08-31 16:26:04');
insert into t values ('TR2', 'FG',   'GSDFGSG',  2, timestamp '2017-08-31 16:05:39');
insert into t values ('TR1', 'FG',   'GSDFGSG',  2, timestamp '2017-08-30 16:30:16');
insert into t values ('TR5', 'FG',   'GSDFGSG',  3, timestamp '2017-08-31 17:00:00');

编辑:

添加part_nototal列以及group by子句:

select min(id) id, part_no, min(sq) total
  from (select t.*,               
               sum(quantity) over (partition by part_no order by id) sq
          from t
          where part_no = 'GSDFGSG' 
          ) 
  where sq >= 8 
  group by part_no


ID  PART_NO       TOTAL
--- -------- ----------
TR3 GSDFGSG          14