在oracle中如何找出对应的其他列具有最大值的one/two列数据
In oracle How can I Find out one/two Columns data which corresponding other columns have maximum value
我正在使用 Oracle,
我有一个 Table(FE_IMPORT_LC
Table),其中包含我在以下几列中提供的数据
TRANSMIT_LC_NO LIAB_AMT_LCY REM_LC_AMT_LCY IMP_AMEND_NO
108615020048 10022000 10022112 00
108615020048 10022000 10022112 01
108615020048 10022000 10022112 02
108615020048 11692000 8351760 03
我想找出红色标记行的数据,其中 IMP_AMEND_NO 列值最大。这意味着我想找出对应的其他列具有最大值的 one/two 列数据。
所以,我已经创建了以下查询:
SELECT l1.liab_amt_lcy
FROM fe_import_lc l1
WHERE l1.transmit_lc_no = '108615020048'
AND l1.imp_amend_no = (SELECT MAX(l2.imp_amend_no)
FROM fe_import_lc l2
WHERE l2.transmit_lc_no = l1.transmit_lc_no)
但是我想要更有效的查询,如果有人知道请...
请尽快给answer/reply。
尝试一下;
select liab_amt_lcy
from (
SELECT l1.liab_amt_lcy, imp_amend_no
FROM fe_import_lc l1
WHERE l1.transmit_lc_no = '108615020048'
order by imp_amend_no desc
)
where rownum < 2
尝试如下所示,其中 l1 是您的 FE_IMPORT_LC table。最好使用下面给出的 l2 table 逻辑创建视图,然后 select.
with l1(TRANSMIT_LC_NO, LIAB_AMT_LCY, REM_LC_AMT_LCY, IMP_AMEND_NO) as(
select 108615020048,10022000,10022112,00 from dual union
select 108615020048,10022000,10022112,01 from dual union
select 108615020048,10022000,10022112,02 from dual union
select 108615020048,10022000,10022112,03 from dual
), l2 as(
select l1.*,row_number() over (partition by TRANSMIT_LC_NO order by IMP_AMEND_NO desc) as rno from l1)
select TRANSMIT_LC_NO, LIAB_AMT_LCY,REM_LC_AMT_LCY,IMP_AMEND_NO from l2
where rno=1;
如果 2 行具有相同的最大值(IMP_AMEND_NO)并且如果你想要两者,请使用下面的查询(而不是 row_number,我在这里使用排名。其余相同。
with l1(TRANSMIT_LC_NO, LIAB_AMT_LCY, REM_LC_AMT_LCY, IMP_AMEND_NO) as(
select 108615020048,10022000,10022112,00 from dual union all
select 108615020048,10022000,10022112,01 from dual union all
select 108615020048,10022000,10022112,03 from dual union all
select 108615020048,10022000,10022112,03 from dual
), l2 as(
select l1.*,rank() over (partition by TRANSMIT_LC_NO order by IMP_AMEND_NO desc) as rno from l1)
select TRANSMIT_LC_NO, LIAB_AMT_LCY,REM_LC_AMT_LCY,IMP_AMEND_NO from l2
where rno=1;
在这里您不必明确指定 TRANSMIT_LC_NO。如果你有很多记录,那么你也只能得到对应于 max(IMP_AMEND_NO) 的行。但是如果你想使用这是一个 PL/SQL 块,那么将 TRANSMIT_LC_NO 放在 FE_IMPORT_LC 的 select 查询的 where 子句中,然后像下面那样继续。
你可以试试这个,我目前没有测试语法错误的环境。但是,我认为稍加修改就可以正常工作
select * from
(
select TRANSMIT_LC_NO, LIAB_AMT_LCY, REM_LC_AMT_LCY, IMP_AMEND_NO,
row_number() over(partition by transmit_lc_no order by imp_amend_no desc) as MAX_ID
from fe_import_lc
)
t where t.MAX_ID=1
and T.TRANSMIT_LC_NO = '108615020048';
我正在使用 Oracle,
我有一个 Table(FE_IMPORT_LC
Table),其中包含我在以下几列中提供的数据
TRANSMIT_LC_NO LIAB_AMT_LCY REM_LC_AMT_LCY IMP_AMEND_NO
108615020048 10022000 10022112 00
108615020048 10022000 10022112 01
108615020048 10022000 10022112 02
108615020048 11692000 8351760 03
我想找出红色标记行的数据,其中 IMP_AMEND_NO 列值最大。这意味着我想找出对应的其他列具有最大值的 one/two 列数据。
所以,我已经创建了以下查询:
SELECT l1.liab_amt_lcy
FROM fe_import_lc l1
WHERE l1.transmit_lc_no = '108615020048'
AND l1.imp_amend_no = (SELECT MAX(l2.imp_amend_no)
FROM fe_import_lc l2
WHERE l2.transmit_lc_no = l1.transmit_lc_no)
但是我想要更有效的查询,如果有人知道请...
请尽快给answer/reply。
尝试一下;
select liab_amt_lcy
from (
SELECT l1.liab_amt_lcy, imp_amend_no
FROM fe_import_lc l1
WHERE l1.transmit_lc_no = '108615020048'
order by imp_amend_no desc
)
where rownum < 2
尝试如下所示,其中 l1 是您的 FE_IMPORT_LC table。最好使用下面给出的 l2 table 逻辑创建视图,然后 select.
with l1(TRANSMIT_LC_NO, LIAB_AMT_LCY, REM_LC_AMT_LCY, IMP_AMEND_NO) as(
select 108615020048,10022000,10022112,00 from dual union
select 108615020048,10022000,10022112,01 from dual union
select 108615020048,10022000,10022112,02 from dual union
select 108615020048,10022000,10022112,03 from dual
), l2 as(
select l1.*,row_number() over (partition by TRANSMIT_LC_NO order by IMP_AMEND_NO desc) as rno from l1)
select TRANSMIT_LC_NO, LIAB_AMT_LCY,REM_LC_AMT_LCY,IMP_AMEND_NO from l2
where rno=1;
如果 2 行具有相同的最大值(IMP_AMEND_NO)并且如果你想要两者,请使用下面的查询(而不是 row_number,我在这里使用排名。其余相同。
with l1(TRANSMIT_LC_NO, LIAB_AMT_LCY, REM_LC_AMT_LCY, IMP_AMEND_NO) as(
select 108615020048,10022000,10022112,00 from dual union all
select 108615020048,10022000,10022112,01 from dual union all
select 108615020048,10022000,10022112,03 from dual union all
select 108615020048,10022000,10022112,03 from dual
), l2 as(
select l1.*,rank() over (partition by TRANSMIT_LC_NO order by IMP_AMEND_NO desc) as rno from l1)
select TRANSMIT_LC_NO, LIAB_AMT_LCY,REM_LC_AMT_LCY,IMP_AMEND_NO from l2
where rno=1;
在这里您不必明确指定 TRANSMIT_LC_NO。如果你有很多记录,那么你也只能得到对应于 max(IMP_AMEND_NO) 的行。但是如果你想使用这是一个 PL/SQL 块,那么将 TRANSMIT_LC_NO 放在 FE_IMPORT_LC 的 select 查询的 where 子句中,然后像下面那样继续。
你可以试试这个,我目前没有测试语法错误的环境。但是,我认为稍加修改就可以正常工作
select * from
(
select TRANSMIT_LC_NO, LIAB_AMT_LCY, REM_LC_AMT_LCY, IMP_AMEND_NO,
row_number() over(partition by transmit_lc_no order by imp_amend_no desc) as MAX_ID
from fe_import_lc
)
t where t.MAX_ID=1
and T.TRANSMIT_LC_NO = '108615020048';