假设我们有一个包含这些列的表BNK_ACCT_GRP_ST:
Column Name ID Pk Null? Data Type
BNK_ACCT_GRP_ST_ID1 1 N NUMBER (15)
BNK_ACCT_ID 2 N NUMBER (15)
BNK_ACCT_GRP_ID 3 N NUMBER (15)
BNK_ACCT_GRP_ST_CD 4 N NUMBER (4)
BNK_ACGRP_ST_SRC_EVNT_TYP_CD 8 N NUMBER (4)
BNK_ACGRP_ST_SRC_TRAN_ID 9 N NUMBER (15)
FNCL_GRP_ID 10 N NUMBER (15)
CREN_DT 12 N DATE
LAST_UPD_DT 13 N DATE
PCSG_DT 14 N DATE
BNK_ACCT_GRP_ST_SEQ_NO 15 N NUMBER (15)
填充了bnk_accts数据:
示例#1:
BNK_ACCT_GRP_ST_ID BNK_ACCT_ID BNK_ACCT_GRP_ID BNK_ACCT_GRP_ST_CD BNK_ACGRP_ST_SRC_EVNT_TYP_CD FNCL_GRP_ID BNK_ACCT_GRP_ST_SEQ_NO
2282 150627009 1724 4 150 111111111 2
2283 150627009 1440 2 149 111111112 1
1908 150627009 1725 2 134 111111111 1
1906 150627009 1441 2 135 111111111 7
和示例#2:
BNK_ACCT_GRP_ST_ID BNK_ACCT_ID BNK_ACCT_GRP_ID BNK_ACCT_GRP_ST_CD BNK_ACGRP_ST_SRC_EVNT_TYP_CD FNCL_GRP_ID BNK_ACCT_GRP_ST_SEQ_NO
2364 150275031 1435 2 114 133333333 3
2365 150275031 1436 7 116 133333333 2
1902 150275031 1435 1 72 133333333 2
1903 150275031 1435 2 36 133333333 1
1904 150275031 1436 5 74 133333333 1
其中:
我需要的是:创建一个查询,根据FNCL_GRP_ID为每个BNK_ACCT_ID提取最新的BNK_ACCT_GRP_ID。这里一个银行的acc可以属于一个或多个fncl机构,所以查询应该返回这个输出:
例如#1:
FNCL_GRP_ID BNK_ACCT_ID BNK_ACCT_GRP_ID
111111111 150627009 1725
111111112 150627009 1440
例如#2:
FNCL_GRP_ID BNK_ACCT_ID BNK_ACCT_GRP_ID
133333333 150275031 1436
我最近尝试过很多东西,例如
的组合(select distinct BNK_ACCT_ID,FNCL_GRP_ID) join to rank() over (partiton by )
但没有运气。
答案 0 :(得分:2)
试试这个:
WITH BankData AS
(
SELECT a.*,
ROW_NUMBER()
OVER(PARTITION BY fncl_grp_id, bnk_acct_id ORDER BY bnk_acct_grp_id DESC) AS Position
FROM bnk_acct_grp_st a
)
SELECT *
FROM BankData
WHERE Position = 1
答案 1 :(得分:0)
@Chandu's是一种相当普遍的解决方案,允许您将最大值与任意列一起拉出。但是,如果您在输出中只需要这三列(FNCL_GRP_ID
,BNK_ACCT_ID
,BNK_ACCT_GRP_ID
),那么您还可以使用旧的GROUP BY
子句:
SELECT
FNCL_GRP_ID,
BNK_ACCT_ID,
MAX(BNK_ACCT_GRP_ID) AS BNK_ACCT_GRP_ID
FROM BNK_ACCT_GRP_ST
GROUP BY
FNCL_GRP_ID,
BNK_ACCT_ID