Oracle max和rank函数的结果不正确
我试图返回一个带有最新psi分数的行,但是我的代码返回了多行,并且我实际想要的行作为结果集中的最后一行返回。如何使用此代码来解决此问题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
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日期(我将编辑以显示如何);“数千名候选人”是不相关的。另外,你所说的“基于日期范围”是什么意思?你的帖子中没有关于日期范围的内容。对不起,请忽略日期范围。