如何按同一查询中的结果过滤分区

问题描述 投票:0回答:1

我正在 Oracle SQL Dev 中执行以下代码,它正确返回所有帐户/应用程序:

SELECT b.SORT_CODE||b.ACCOUNT_NO, COLLATERAL_ID, LOAN_SIZE, CURRENT_BALANCE, processing_date, s.SORT_CODE||s.ACCOUNT_NO, APPLICATION_CREATED_DATE, APPLICATION_ID, DT_OUTCOME,
    row_number ()over (partition by b.SORT_CODE||b.ACCOUNT_NO order by APPLICATION_CREATED_DATE desc) as rank
FROM NG1_RR.MCD_CBTL_DATA b, NG1_PSD_TMP.TMP_RMC_APP s
WHERE b.SORT_CODE||b.ACCOUNT_NO = s.SORT_CODE||s.ACCOUNT_NO
    and processing_date = '08-JAN-24'
ORDER BY LOAN_SIZE desc;

但是“排名”返回 1-20 的值,我只想过滤 2 个最新条目,因此排名在 ('1', '2') 中。

对这个级别的 SQL 查询相当陌生,我目前正在努力找出答案。

执行上面的代码并获得预期结果,但是无法弄清楚如何按“排名”进一步过滤查询。

尝试了多种方法,研究子查询等(如下所示),但是所有尝试都导致了失败,我只是没有专业知识来解决:

SELECT b.SORT_CODE||b.ACCOUNT_NO, COLLATERAL_ID, LOAN_SIZE, CURRENT_BALANCE, processing_date, s.SORT_CODE||s.ACCOUNT_NO APPLICATION_CREATED_DATE,APPLICATION_ID,DT_OUTCOME 
FROM ( select b.SORT_CODE||b.ACCOUNT_NO, COLLATERAL_ID, LOAN_SIZE, CURRENT_BALANCE, processing_date, APPLICATION_CREATED_DATE,APPLICATION_ID,DT_OUTCOME,
    row_number ()over (partition by b.SORT_CODE||b.ACCOUNT_NO order by APPLICATION_CREATED_DATE desc) as rank
FROM ACCOUNT b, APPLICATION s) t
WHERE b.SORT_CODE||b.ACCOUNT_NO = s.SORT_CODE||s.ACCOUNT_NO
    and t.rank <=2
    and processing_date = '08-JAN-24'
ORDER BY LOAN_SIZE desc;

返回错误 -

ORA-00904: "S"."ACCOUNT_NO": invalid identifier

非常感谢任何帮助。

sql oracle-sqldeveloper row-number partition-by
1个回答
0
投票

您的子查询尝试

SELECT b.SORT_CODE||b.ACCOUNT_NO, COLLATERAL_ID, LOAN_SIZE, CURRENT_BALANCE, processing_date, s.SORT_CODE||s.ACCOUNT_NO APPLICATION_CREATED_DATE,APPLICATION_ID,DT_OUTCOME 
FROM ( select b.SORT_CODE||b.ACCOUNT_NO, COLLATERAL_ID, LOAN_SIZE, CURRENT_BALANCE, processing_date, APPLICATION_CREATED_DATE,APPLICATION_ID,DT_OUTCOME,
    row_number ()over (partition by b.SORT_CODE||b.ACCOUNT_NO order by APPLICATION_CREATED_DATE desc) as rank
FROM ACCOUNT b, APPLICATION s) t
WHERE b.SORT_CODE||b.ACCOUNT_NO = s.SORT_CODE||s.ACCOUNT_NO
    and t.rank <=2
    and processing_date = '08-JAN-24'
ORDER BY LOAN_SIZE desc;

出现错误

ORA-00904:“S”。“ACCOUNT_NO”:无效标识符

因为您试图在外部查询中引用

s
表别名,但这仅在子查询内的范围内。

您在子查询内留下了一个串联,并将另一个串联移到了外部,这有点奇怪。如果内部有两个串联,那么您可以执行此操作,请注意这些必须具有别名,以便它们是唯一的名称:

SELECT b_SORT_CODE_ACCOUNT_NO, COLLATERAL_ID, LOAN_SIZE,
  CURRENT_BALANCE, processing_date, s_SORT_CODE_ACCOUNT_NO,
  APPLICATION_CREATED_DATE, APPLICATION_ID, DT_OUTCOME 
FROM (
  select
    b.SORT_CODE||b.ACCOUNT_NO AS b_SORT_CODE_ACCOUNT_NO,
    COLLATERAL_ID,
    LOAN_SIZE,
    CURRENT_BALANCE,
    processing_date,
    s.SORT_CODE||s.ACCOUNT_NO AS s_SORT_CODE_ACCOUNT_NO,
    APPLICATION_CREATED_DATE,
    APPLICATION_ID,
    DT_OUTCOME,
    row_number () over (partition by b.SORT_CODE||b.ACCOUNT_NO order by APPLICATION_CREATED_DATE desc) as rank
  FROM ACCOUNT b, APPLICATION s
  WHERE b.SORT_CODE||b.ACCOUNT_NO = s.SORT_CODE||s.ACCOUNT_NO
  and processing_date = '08-JAN-24'
) t
WHERE t.rank <= 2
ORDER BY LOAN_SIZE desc;

尽管我会更改为现代连接语法,并传递一个日期值(假设

processng_date
实际上是一个日期列),而不是依赖隐式转换和 NLS 设置:

  FROM ACCOUNT b
  JOIN APPLICATION s
  ON b.SORT_CODE = s.SORT_CODE
  AND b.ACCOUNT_NO = s.ACCOUNT_NO
  WHERE processing_date = DATE '2024-01-08'

并且分区依据也不需要连接,可以是

partition by b.SORT_CODE, b.ACCOUNT_NO order by ...

您还可以将它们保留为单独的值并在外部查询中将它们连接起来,但您仍然需要为它们添加别名,以便它们是唯一的:

SELECT b_SORT_CODE||b_ACCOUNT_NO, COLLATERAL_ID, LOAN_SIZE,
  CURRENT_BALANCE, processing_date, s_SORT_CODE||s_ACCOUNT_NO,
  APPLICATION_CREATED_DATE, APPLICATION_ID, DT_OUTCOME 
FROM (
  select
    b.SORT_CODE AS b_SORT_CODE,
    b.ACCOUNT_NO AS b_ACCOUNT_NO,
    COLLATERAL_ID,
    LOAN_SIZE,
    CURRENT_BALANCE,
    processing_date,
    s.SORT_CODE AS s_SORT_CODE,
    s.ACCOUNT_NO AS s_ACCOUNT_NO,
    APPLICATION_CREATED_DATE,
    APPLICATION_ID,
    DT_OUTCOME,
    row_number () over (partition by b.SORT_CODE, b.ACCOUNT_NO order by APPLICATION_CREATED_DATE desc) as rank
  FROM ACCOUNT b
  JOIN APPLICATION s
  ON b.SORT_CODE = s.SORT_CODE
  AND b.ACCOUNT_NO = s.ACCOUNT_NO
  WHERE processing_date = DATE '2024-01-08'
) t
WHERE t.rank <= 2
ORDER BY LOAN_SIZE desc;

话虽如此,由于排序代码和帐号匹配,从连接条件来看,目前还不清楚为什么您要在输出中同时包含

b
s
值。

当然一切都未经测试,因为我们没有您的表格或数据。

© www.soinside.com 2019 - 2024. All rights reserved.