SQL Developer为每个ID选择最大记录和整行

时间:2012-04-09 17:34:24

标签: sql oracle

我是使用SQL的新手,我找不到任何似乎回答我的问题的帖子。我需要一份声明,它将为我提供数据库中每个客户的最新批准提交以及与该提交相关的所有行/列数据。每个提交都会分配一个唯一的ID号,并且位于名为ASMT_ID的列中。唯一的客户ID号是一个名为PRTPT_ID的列。

因此,对于数据库T_FINANCIAL_ITEM中的每个PRTPT_ID,我想找到每个客户的MAX ASMT_ID,并显示与每个PRTPT_ID关联的所有数据列和行,但前提是STTS_NAME等于“已批准”。

简单来说,我正在尝试做什么:

select * from T_FINANCIAL_ITEM
For each PRTPT_ID SELECT MAX ASMT_ID
WHERE STTS_NAME = 'Approved'
GROUP by PRTPT_ID

*的 更新 * 我将需要分析同一个表FYE_DT和SUBM_TYPE中的另外两个字段,而不是使用asmt_id。

标准是:

  1. 最近的FYE_DT,其中stts_name为“已批准”(即2011年之前的2011年)。
  2. 在最近的fye_dt中,审核了subm_type
  3. 在最近的fye_dt中,如果他们没有经过审核的subm_type,则未经审核的subm_type
  4. 它将提取与符合条件的提交相关联的所有数据行
  5. 例如:

    PRTPT_ID    ASMT_ID FYE_DT                       SUBM_TYPE_NAME  
    8493000000  18016   30-JUN-09 12.00.00.000000000 AM Unaudited/A-133  
    8493000000  19574   30-JUN-09 12.00.00.000000000 AM Audited/A-133  
    8493000000  28039   30-JUN-10 12.00.00.000000000 AM Unaudited/A-133  
    8493000000  33620   30-JUN-10 12.00.00.000000000 AM Audited/A-133  
    9481000000  38049   31-DEC-10 12.00.00.000000000 AM Unaudited/Non-A133  
    9481000000  58020   31-DEC-09 12.00.00.000000000 AM Audited/Non-A-133  
    9481000000  48139   31-DEC-11 12.00.00.000000000 AM Unaudited/Non-A-133  
    

    结果:

    PRTPT_ID    ASMT_ID FYE_DT                       SUBM_TYPE_NAME  
    8493000000  33620   30-JUN-10 12.00.00.000000000 AM Audited/A-133  
    9481000000  48139   31-DEC-11 12.00.00.000000000 AM Unaudited/Non-A-133  
    

    注意:可能有多行数据与这些结果相关联。我需要拥有所有数据行。

2 个答案:

答案 0 :(得分:2)

一种相对标准的方法是使用分析函数。如果我理解您的更新,听起来您希望ORDER BY子句类似于

select *
  from (select t.*,
               rank() over (partition by prtpt_id
                                      order by fye_dt desc,
                                               (case when subm_type_name like 'Audited%'
                                                     then 2
                                                     when subm_type_name like 'Unaudited%'
                                                     then 1
                                                     else 0
                                                  end) desc) rnk
          from t_financial_item t
         where stts_name = 'Approved')
 where rnk = 1

答案 1 :(得分:0)

你的桌子结构是什么?这似乎是你正在寻找的东西:

select MAX(ASMT_ID),PRTPT_ID from PRTPT_ID_TABLE p
   INNER JOIN ASMT_ID_TABLE a on p.PRTPT_ID = a.PRTPT_ID
   WHERE STTS_NAME = 'Approved' 
   GROUP by PRTPT_ID

但我没有看到任何表格。 T_FINANCIAL_ITEM是表还是数据库名称?