仅选择 Oracle SQL 中的最大值

Selecting only the highest value in Oracle SQL

我有一个查询,对于每个 CONTROLNBR + LINENBR 组合,我可能只得到一条或多条记录 -

SELECT ACCTNBR, BOOKDATE, CONTROLNBR, LINENBR, TRANDETSEQ, 
ING1, ING1AMT, ING2, ING2AMT, ING3, ING3AMT, ING4, ING4AMT  
FROM TABLE1  WHERE COSTCENTER = '9999' ORDER BY CONTROLNBR, LINENBR, 
TRANDETSEQ

一些返回的数据可能是 -

12345   01-FEB-19   3771    1   5   R4  13  Y1  41  Y3  1
12345   01-FEB-19   3771    1   11  R4  21  Y1  41  Y3  9
12345   01-FEB-19   3771    1   12  R4  21  Y1  41  Y3  17
12345   01-FEB-19   3771    1   18  R4  21  Y1  61  Y3  45
12345   01-FEB-19   3772    3   5   R2  3   Y3  38  L1  8
12345   01-FEB-19   3773    1   5   N1  8   W1  2   L1  42
12345   01-FEB-19   3773    1   12  N1  10  W1  4   L1  45
24568   01-FEB-19   3786    2   4   L1 28   G2  40  N1  13
24568   01-FEB-19   3786    2   8   L1 28   G2  45  N1  18
24568   01-FEB-19   3786    2   12  L1 28   G2  48  N1  18

在每种情况下,对于每个 CONTROLNBR + LINENBR 组合,我只需要具有最高 TRANDETSEQ 编号的行。所以我只想 -

12345   01-FEB-19   3771    1   18  R4  21  Y1  61  Y3  45
12345   01-FEB-19   3772    3   5   R2  3   Y3  38  L1  8
12345   01-FEB-19   3773    1   12  N1  10  W1  4   L1  45
24568   01-FEB-19   3786    2   12  L1 28   G2  48  N1  18

是否有一些函数或诸如 LAST 或 MAX 之类的东西可以在这里工作?

对它们进行排名,然后获取排名最高的行。

示例数据:

SQL> with test (acctnbr, controlnbr, linenbr, trandatseq) as
  2    (select 12345, 3771, 1, 5 from dual union all
  3     select 12345, 3771, 1, 11 from dual union all
  4     select 12345, 3771, 1, 12 from dual union all
  5     select 12345, 3771, 1, 18 from dual union all
  6     --
  7     select 12345, 3772, 3, 5  from dual union all
  8     --
  9     select 12345, 3773, 1, 5  from dual union all
 10     select 12345, 3773, 1, 12 from dual union all
 11     --
 12     select 24568, 3786, 2, 4  from dual union all
 13     select 24568, 3786, 2, 12 from dual
 14    ),

查询从这里开始:

 15  temp as
 16    -- sort them
 17    (select t.*,
 18        rank() over (partition by acctnbr, controlnbr , linenbr order by trandatseq desc) rnk
 19     from test t
 20    )
 21  -- finally, fetch rows that rank as "highest"
 22  select acctnbr, controlnbr, linenbr, trandatseq
 23  from temp
 24  where rnk = 1;

   ACCTNBR CONTROLNBR    LINENBR TRANDATSEQ
---------- ---------- ---------- ----------
     12345       3771          1         18
     12345       3772          3          5
     12345       3773          1         12
     24568       3786          2         12

SQL>