不同+加入等级

时间:2012-07-03 18:12:48

标签: sql oracle11gr2

假设我们有一个包含这些列的表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

其中:

  • BNK_ACCT_GRP_ST_ID是自动增量字段,
  • BNK_ACCT_ID实际上是银行帐号#id,
  • BNK_ACCT_GRP_ID是grp id(总是在增加),
  • BNK_ACCT_GRP_ST_CD,BNK_ACGRP_ST_SRC_EVNT_TYP_CD和BNK_ACGRP_ST_SRC_TRAN_ID是一些用于转换的ID,
  • FNCL_GRP_ID - 此银行协议所属的银行机构的ID

我需要的是:创建一个查询,根据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 ) 

但没有运气。

2 个答案:

答案 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_IDBNK_ACCT_IDBNK_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