仅选择 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>
我有一个查询,对于每个 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>