Oracle 使用分析函数优化或简化复杂选择

Oracle 使用分析函数优化或简化复杂选择,oracle,plsql,Oracle,Plsql,在table语句中给定以下数据(下面提供了创建和数据插入命令),我希望提取STATEMENTNUMBER的最大值对应的STATEMENTDATETIME的最大值的字段CUMULATEDAMOUNT的值,该记录组具有与ACCOUNTKEY值相同的ACCOUNTKEY值,其中RUNID=14547 SQL>按2,4的顺序从语句中选择* +------------+----------+---------------+------------------+----------------+------

在table语句中给定以下数据(下面提供了创建和数据插入命令),我希望提取STATEMENTNUMBER的最大值对应的STATEMENTDATETIME的最大值的字段CUMULATEDAMOUNT的值,该记录组具有与ACCOUNTKEY值相同的ACCOUNTKEY值,其中RUNID=14547

SQL>按2,4的顺序从语句中选择*

+------------+----------+---------------+------------------+----------------+------+-----------------+----------+ |STATEMENTKEY|ACCOUNTKEY|CLASSIFICATION | STATEMENTDATETIME|STATEMENTNUMBER |RUNID |CUMULATEDAMOUNT |STATUS | +------------+----------+---------------+------------------+----------------+------+-----------------+----------+ | 111177| 888881|EndOfDay | 27/11/15 | 199 |14306 | 202,12 |Created | | 111177| 888881|EndOfDay | 27/11/15 | 192 |14302 | 606,66 |Processed | | 111155| 888882|EndOfDay | 30/11/15 | 301 |14552 | 303,33 |Processed | | 111127| 888886|IncIday | 27/11/15 | 198 |14506 | 707,77 |Processed | | 111118| 888888|EndOfDay | 17/11/15 | 119 |14547 | 808,88 |Processed | | 111112| 888888|EndOfDay | 19/11/15 | 103 |14500 | 909,99 |Processed | | 111144| 888888|EndOfDay | 27/11/15 | 204 |14509 | 505,55 |Processed | | 111183| 888888|EndOfDay | 28/11/15 | 202 |14514 | 404,44 |Processed | | 111104| 888888|EndOfDay | 29/11/15 | 201 |14513 | 101,11 |Processed | | 111194| 888888|EndOfDay | 29/11/15 | 239 |14813 | 102,22 |Processed | +------------+----------+---------------+------------------+----------------+------+-----------------+----------+ 10 ligne(s) selectionnee(s). +------------+----------+-----------------+--------------------+-------------------+------+---------------+---------+ |STATEMENTKEY|ACCOUNTKEY| CLASSIFICATION | STATEMENTDATETIME | STATEMENTNUMBER | RUNID|CUMULATEDAMOUNT|STATUS | |------------|----------|-----------------|--------------------|-------------------+------+---------------+---------| | 111118| 888888| EndOfDay | 17/11/15 | 119 | 14547| 808,88 |Processed| | 111112| 888888| EndOfDay | 27/11/15 | 103 | 14500| 909,99 |Processed| | 111144| 888888| EndOfDay | 28/11/15 | 204 | 14509| 505,55 |Processed| | 111183| 888888| EndOfDay | 29/11/15 | 202 | 14514| 404,44 |Processed| | 111104| 888888| EndOfDay | 29/11/15 | 201 | 14513| 101,11 |Processed| | 111194| 888888| EndOfDay | 29/11/15 | 239 | 14813| 102,22 |Processed| +------------+----------+-----------------+--------------------+-------------------+------+---------------+---------+ 6 ligne(s) selectionnee(s). 插入数据:

insert into statement (statementkey,accountkey,classification,statementdatetime,statementnumber,runid,cumulatedamount,status)values (111104,888888,'EndOfDay',to_date('29-11-2015 11:00:00','DD-MM-YYYY HH24:MI:SS'),201,14513,101.11,'Processed');
insert into statement (statementkey,accountkey,classification,statementdatetime,statementnumber,runid,cumulatedamount,status)values (111194,888888,'EndOfDay',to_date('29-11-2015 11:00:00','DD-MM-YYYY HH24:MI:SS'),239,14813,102.22,'Processed');
insert into statement (statementkey,accountkey,classification,statementdatetime,statementnumber,runid,cumulatedamount,status)values (111177,888881,'EndOfDay',to_date('27-11-2015 11:00:00','DD-MM-YYYY HH24:MI:SS'),199,14306,202.12,'Created');
insert into statement (statementkey,accountkey,classification,statementdatetime,statementnumber,runid,cumulatedamount,status)values (111155,888882,'EndOfDay',to_date('30-11-2015 11:00:00','DD-MM-YYYY HH24:MI:SS'),301,14552,303.33,'Processed');
insert into statement (statementkey,accountkey,classification,statementdatetime,statementnumber,runid,cumulatedamount,status)values (111183,888888,'EndOfDay',to_date('28-11-2015 11:00:00','DD-MM-YYYY HH24:MI:SS'),202,14514,404.44,'Processed');
insert into statement (statementkey,accountkey,classification,statementdatetime,statementnumber,runid,cumulatedamount,status)values (111144,888888,'EndOfDay',to_date('27-11-2015 11:00:00','DD-MM-YYYY HH24:MI:SS'),204,14509,505.55,'Processed');
insert into statement (statementkey,accountkey,classification,statementdatetime,statementnumber,runid,cumulatedamount,status)values (111177,888881,'EndOfDay',to_date('27-11-2015 11:00:00','DD-MM-YYYY HH24:MI:SS'),192,14302,606.66,'Processed');
insert into statement (statementkey,accountkey,classification,statementdatetime,statementnumber,runid,cumulatedamount,status)values (111127,888886,'IncIday',to_date('27-11-2015 11:00:00','DD-MM-YYYY HH24:MI:SS'),198,14506,707.77,'Processed');
insert into statement (statementkey,accountkey,classification,statementdatetime,statementnumber,runid,cumulatedamount,status)values (111118,888888,'EndOfDay',to_date('17-11-2015 11:00:00','DD-MM-YYYY HH24:MI:SS'),119,14547,808.88,'Processed');
insert into statement (statementkey,accountkey,classification,statementdatetime,statementnumber,runid,cumulatedamount,status)values (111112,888888,'EndOfDay',to_date('19-11-2015 11:00:00','DD-MM-YYYY HH24:MI:SS'),103,14500,909.99,'Processed');
commit;
我想通过使用解析函数简化上述选择,任何帮助都将不胜感激

SELECT *
  FROM (SELECT *
         FROM STATEMENT
         WHERE ACCOUNTKEY = (SELECT ACCOUNTKEY FROM STATEMENT WHERE RUNID = 14547)
         ORDER BY STATEMENTDATETIME DESC,  STATEMENTNUMBER DESC
       )
   WHERE ROWNUM = 1
或使用分析函数而不是rownum:

SELECT *
  FROM (SELECT s.*
              ,row_number() OVER(ORDER BY STATEMENTDATETIME DESC, STATEMENTNUMBER DESC) rn
         FROM STATEMENT s
         WHERE ACCOUNTKEY = (SELECT ACCOUNTKEY FROM STATEMENT WHERE RUNID = 14547)
       )
   WHERE rn = 1 
*
s替换为
累计金额

并相应地将其他筛选条件
状态添加到('Processed'、'Created')

或使用分析函数而不是rownum:

SELECT *
  FROM (SELECT s.*
              ,row_number() OVER(ORDER BY STATEMENTDATETIME DESC, STATEMENTNUMBER DESC) rn
         FROM STATEMENT s
         WHERE ACCOUNTKEY = (SELECT ACCOUNTKEY FROM STATEMENT WHERE RUNID = 14547)
       )
   WHERE rn = 1 
*
s替换为
累计金额


并在('Processed'、'Created')中添加其他筛选条件
状态。
相应地…

请在下面使用
RANK()覆盖(分区依据..顺序依据..)


请在下面使用(
RANK()覆盖(分区依据..顺序依据..)


我投了更高的票。在上面的第二个查询的内部子查询中,
ORDER BY STATEMENTDATETIME DESC,STATEMENTNUMBER DESC
有什么用处在第二个查询中,它只在
OVER
子句中需要,而不在子查询本身上需要。它保留在子查询上,因为我从第一个查询中剪切并粘贴,这确实需要子查询上的
orderby
,以便包装上的
ROWNUM=1
命中正确的记录。我将更新第二个查询。我已将其向上投票。在上面的第二个查询的内部子查询中,
ORDER BY STATEMENTDATETIME DESC,STATEMENTNUMBER DESC
有什么用处在第二个查询中,它只在
OVER
子句中需要,而不在子查询本身上需要。它保留在子查询上,因为我从第一个查询中剪切并粘贴,这确实需要子查询上的
orderby
,以便包装上的
ROWNUM=1
命中正确的记录。我将更新第二个查询。
SELECT *
  FROM (SELECT s.*
              ,row_number() OVER(ORDER BY STATEMENTDATETIME DESC, STATEMENTNUMBER DESC) rn
         FROM STATEMENT s
         WHERE ACCOUNTKEY = (SELECT ACCOUNTKEY FROM STATEMENT WHERE RUNID = 14547)
       )
   WHERE rn = 1 
SELECT CUMULATEDAMOUNT
FROM (
  SELECT CUMULATEDAMOUNT
    , RANK() OVER (ORDER BY STATEMENTDATETIME DESC, STATEMENTNUMBER DESC) RNK
  FROM (
    SELECT * 
    FROM STATEMENT
    WHERE ACCOUNTKEY IN (
        SELECT ACCOUNTKEY 
          FROM STATEMENT
        WHERE RUNID = 14547
      )
  )
) WHERE RNK = 1