在oracle中如何查找与其他列具有最大值的

时间:2015-09-16 05:19:43

标签: sql oracle greatest-n-per-group

我在哪里使用Oracle,
我有一个表(FE_IMPORT_LC表),其中的数据来自我在下面几列中提供的数据

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列值最大。这意味着我想找出一个/两个列数据,其中相应的其他列具有最大值。

所以,我已经创建了以下查询:

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)

但是我想要更有效的查询,如果有人知道请...请尽快回答/回复。

3 个答案:

答案 0 :(得分:0)

尝试;

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

答案 1 :(得分:0)

尝试类似下面的内容,其中l1将是您的FE_IMPORT_LC表。最好使用下面给出的l2表逻辑创建一个视图,然后选择。

          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子句中,并按照下面的步骤进行操作。

答案 2 :(得分:0)

你可以试试这个,我目前没有环境来测试语法错误。但是,我认为稍加修改它应该可以正常工作

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';