Oracle max和rank函数的结果不正确

Oracle max和rank函数的结果不正确,oracle,Oracle,我试图返回一个带有最新psi分数的行,但是我的代码返回了多行,并且我实际想要的行作为结果集中的最后一行返回。如何使用此代码来解决此问题 S ELECT REQUEST_NUM,PI_CANDIDATE_NUM, COALESCE (MAX_GCO_AD_KNOWLEDGE_TEST_SCORE, MAX_PSI_OVERALL_SCORE) AS PSI_SCORE --COALESCE(MAX_GCO_AD_KNOWLEDGE_TEST_SCORE,MAX_PSI_OVERA

我试图返回一个带有最新psi分数的行,但是我的代码返回了多行,并且我实际想要的行作为结果集中的最后一行返回。如何使用此代码来解决此问题

S

ELECT REQUEST_NUM,PI_CANDIDATE_NUM,
    COALESCE (MAX_GCO_AD_KNOWLEDGE_TEST_SCORE, MAX_PSI_OVERALL_SCORE) AS PSI_SCORE
    --COALESCE(MAX_GCO_AD_KNOWLEDGE_TEST_SCORE,MAX_PSI_OVERALL_SCORE)-39.035024/8.439997 AS PSI XMation


    FROM(

    SELECT
    REQUEST_NUM,PI_CANDIDATE_NUM,
    MAX(AA.PSI_OVERALL_SCORE) KEEP (DENSE_RANK FIRST ORDER BY AA.ARANK) MAX_PSI_OVERALL_SCORE,
    MAX(AA.GCO_AD_KNOWLEDGE_TEST_SCORE) KEEP (DENSE_RANK FIRST ORDER BY AA.ARANK) MAX_GCO_AD_KNOWLEDGE_TEST_SCORE

    FROM (
    select  
      RANK() OVER (PARTITION BY REQUEST_NUM ORDER BY REQUEST_LAST_MODIFIED_DT ) ARANK
      ,PARENT_PI_NUMBER,REQUEST_NUM,PI_CANDIDATE_NUM,PSI_OVERALL_SCORE,GCO_AD_KNOWLEDGE_TEST_SCORE,REQUEST_LAST_MODIFIED_DT
    from  
       WC_APPLICATION_EVENT_F

    -- GCO_AD_KNOWLEDGE_TEST_SCORE != '10100' and 
      where PI_CANDIDATE_NUM = '4173093'

    --nd GCO_AD_KNOWLEDGE_TEST_SCORE is  null
    ) AA
    --where AA.ARANK=1


    GROUP BY REQUEST_NUM,PI_CANDIDATE_NUM
    --ORDER By PARENT_PI_NUMBER,PI_NUMBER,REQUEST_LAST_MODIFIED_DT;


    )
    BB;

Sample data:

    REQUEST_NUM PI_CANDIDATE_NUM REQUEST_LAST_MODIFIED_DT PSI_SCORE
    ----------- ---------------- ------------------------ ---------
                         4639022        
        1655626          4639022 5-Mar-17
        1662401          4639022 8-Mar-17                 22.6
        1662470          4639022 6-Apr-17   
        1662486          4639022 6-Apr-17   
        1662499          4639022 8-Mar-17                 30.3
        1771817          4639022 7-Jun-17                 35.3
        1797323          4639022 24-Jun-17                38.5

My expected results is the last row with a value of 38.5 since has the latest date.

这里有一种方法可以做到这一点。它假设您输入了一个特定的候选者(否则子查询中的分析函数可以修改,以获得每个候选者的最新非空分数)

编辑:如果需要检索所有候选人的最新分数,则:(1)删除在内部查询中筛选单个候选人的条件;(2) 在
rank()over(
(在左括号后)之后添加
按pi_candidate_num划分的分区,并在
order by…
之前添加一个空格(仍在
rank()
over(…)
子句中)。\EDIT

如果在同一日期获得了两个非空分数(在您的数据中,这可能是不可能的,但如果是…),则两行都将返回

我假设候选者编号是一个数字,所以我删除了条件中的单引号;我更改了候选者编号以匹配您的示例输入

WITH子句不是查询的一部分-请在尝试解决方案之前将其删除

with
  test_data ( request_num, pi_candidate_num, request_last_modified_dt, psi_score ) as (
    select    null, 4639022, null                             , null from dual union all
    select 1655626, 4639022, to_date( '5-Mar-17', 'dd-Mon-rr'), null from dual union all
    select 1662401, 4639022, to_date( '8-Mar-17', 'dd-Mon-rr'), 22.6 from dual union all
    select 1662470, 4639022, to_date( '6-Apr-17', 'dd-Mon-rr'), null from dual union all
    select 1662486, 4639022, to_date( '6-Apr-17', 'dd-Mon-rr'), null from dual union all
    select 1662499, 4639022, to_date( '8-Mar-17', 'dd-Mon-rr'), 30.3 from dual union all
    select 1771817, 4639022, to_date( '7-Jun-17', 'dd-Mon-rr'), 35.3 from dual union all
    select 1797323, 4639022, to_date('24-Jun-17', 'dd-Mon-rr'), 38.5 from dual
  )
select request_num, pi_candidate_num, request_last_modified_dt, psi_score
from   (
         select t.*, rank() over (order by request_last_modified_dt desc) rn
         from   test_data t
         where  pi_candidate_num = 4639022
           and  psi_score is not null
       )
where  rn = 1
;

REQUEST_NUM PI_CANDIDATE_NUM REQUEST_LAST_MODIFIED_DT  PSI_SCORE
----------- ---------------- ------------------------ ----------
    1797323          4639022 24-Jun-17                      38.5

您现在已经问了四个相关问题,但仍然没有提供表定义、样本数据或预期结果。请求数量PI\u候选人数量REQUEST\u LAST\u MODIFIED\u D PSI\u分数4639022 1655626 4639022 5-Mar-17 1662401 4639022 8-Mar-17 22.6 1662470 4639022-Apr-17 1662486 4639022 6-Apr-17 1662499 4639022 8-Mar-17 30.3 1771817 4639022 7-Jun-17 35.3 1797323 4639022 24-Jun-17 38.5我的预期结果是值为38.5的最后一行,因为有最新的日期。顶部代表列名,我无法使它们正确对齐,但以下是它们与数据对齐的方式-----------REQUEST_NUM PI_CANDIDATE_NUM REQUEST_last_DT PSI_SCORE。让我知道如果这有助于在您的问题中而不是在评论中说明这一点。在任何情况下,如果您按某个日期排名并想要最近的一个,请将ORDER by更改为ORDER by DESC,然后选择排名为1的行。“请告知其紧急情况”在你从志愿者那里获得帮助的免费网站上是不合适的。如果你在一个重要的生产问题上需要紧急帮助,请寻找付费帮助。请阅读-总结是,这不是一个解决志愿者问题的理想方式,可能会对获得答案产生反作用。请不要将此添加到你的问题中。不幸的是这是不可行的,因为该查询应该查看数千名候选人,并根据日期范围提取每个候选人的最新分数。@JKim-抱歉,但您尝试的查询有一个硬编码的候选人,您需要其最新分数。我在我的帖子中已经说过,很容易修复它以适用于所有candi日期(我将编辑以显示如何);“数千名候选人”是不相关的。另外,你所说的“基于日期范围”是什么意思?你的帖子中没有关于日期范围的内容。对不起,请忽略日期范围。