SQL开发人员为每个ID选择最大记录和整行

SQL开发人员为每个ID选择最大记录和整行,sql,oracle,Sql,Oracle,我对使用SQL非常陌生,我还没有找到任何以前的帖子来回答我的问题。我需要一份声明,该声明将为数据库中的每个客户提供最新批准的提交,以及与该提交相关的所有数据行/列。每次提交都会分配一个唯一的id号,并位于一个名为ASMT_id的列中。唯一的客户id号是一个名为PRTPT_id的列 因此,对于数据库T_FINANCIAL_项中的每个PRTPT_ID,我希望找到每个客户的最大ASMT_ID,并显示与每个PRTPT_ID关联的所有列和行数据,但前提是STT_名称等于“Approved” 简单地说,我想

我对使用SQL非常陌生,我还没有找到任何以前的帖子来回答我的问题。我需要一份声明,该声明将为数据库中的每个客户提供最新批准的提交,以及与该提交相关的所有数据行/列。每次提交都会分配一个唯一的id号,并位于一个名为ASMT_id的列中。唯一的客户id号是一个名为PRTPT_id的列

因此,对于数据库T_FINANCIAL_项中的每个PRTPT_ID,我希望找到每个客户的最大ASMT_ID,并显示与每个PRTPT_ID关联的所有列和行数据,但前提是STT_名称等于“Approved”

简单地说,我想做的是:

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

标准是:

  • 最新的FYE_DT,stts_名称为“已批准”(即2010年之前的2011年)
  • 在最近的fye_dt中,经审计的子M_类型
  • 在最近的fye_dt中,如果其不是经审计的子M_类型,则为未经审计的子M_类型
  • 它将提取与符合条件的提交相关联的所有数据行
  • 例如:

    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  
    

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

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

    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
    

    但是我没有看到任何桌子。财务项目是表还是数据库名称?

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

    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
    

    你在使用什么数据库?标题中的“SQL Developer”是否意味着您正在使用Oracle数据库和Oracle SQL Developer前端?SQL的哪种风格?MSSQL/MYSQL/Oracle等?@JustinCave是的,我正在使用Oracle SQL Developer front-endT_FINANCIAL_ITEM是表名我输入了以下语句:从T_FINANCIAL_ITEM中选择MAX(ASMT_ID),PRTPT_ID,其中STT_NAME=‘Approved’GROUP by PRTPT_ID;看起来它找到了max记录,但它没有为每个PRTPT_i引入所有数据行/列。如果您需要针对自身加入表,那么您的第一种方法似乎可行,但它只为max记录引入一行数据。我需要与max记录关联的所有数据行。@Craig_C-我更新了我的答案以使用
    rank
    函数,而不是
    row_number
    。如果可以有多行具有相同的
    asmt\u id
    ,则将返回多行。不过,我觉得这是您描述中唯一的值,所以我不确定怎么会有重复的行。如果我的编辑对您没有帮助,那么发布一些示例数据和预期输出会很有帮助,这样我们可以更好地为您提供帮助。asmt_id代表一个唯一的提交,但每个提交下都报告了多个程序。每个程序在不同的行上报告,这就是我需要所有行的原因

    您修改后的声明非常有效。然而,我发现了一个新的转折点
    max asmt_id并不总是提供最新记录。因此,我现在需要分析的是同一个表中年份和提交类型字段的组合。我首先需要最近一年和经审计的提交类型,如果最近一年没有经审计的提交,则查看未经审计的提交。更糟糕的是,有不止一种类型的已审核和未审核提交类型。例如未审计/未审计和未审计/A-133。我可以提供更多的细节,如果必要的话@Craig_C-一些样本数据和预期输出肯定会有帮助。不过,请编辑您的问题以发布该信息,而不是将其放在评论中。