我是使用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。
标准是:
例如:
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
注意:可能有多行数据与这些结果相关联。我需要拥有所有数据行。
答案 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是表还是数据库名称?