如何为系统中有2个帐户的人选择1行

时间:2019-02-01 19:04:43

标签: sql db2 toad

第一部分要实现:我正在尝试返回具有APP_START_DT的人员“ ABC1”的行。 或APP_SUBMIT_DT,但我也想返回Acct_CR_DT,在这种情况下是2018年9月5日,我不希望重复。每人一行这样的记录。

我要实现的2部分:当他们有任何日期时,请根据该日期返回最新状态,在这种情况下,应查看“ APP_SUBMIT_DT”并返回“已提交应用” < / p>

My Table:
ID     NAME    Acct_CR_DT    App_Ap    APP_START_DT    APP_SUBMIT_DT
44444  ABC1    9/5/2018      My univ   9/5/2018        9/14/2018
44444  ABC1    10/2/2018     {null}    {null}          {null}




Desired Results:   
ID     NAME   Acct_CR_DT  App_Ap   APP_START_DT  APP_SUBMIT_DT App_stat
44444  ABC1   9/5/2018    My univ  9/5/2018      9/14/2018     Submt

3 个答案:

答案 0 :(得分:0)

您可以使用聚合:

select id, name, min(acct_cr_dt) as acct_cr_dt, min(app_ap) as app_at,
       min(app_start_dt) as app_start_dt), min(app_submit_dt) as app_submit_dt
from t
group by id, name;

答案 1 :(得分:0)

您可以使用窗口函数row_number()的另一个选项

 select *  from 
 (
  select t.*,row_number()over(partition by id, name order by Acct_CR_DT) rn
  from table_name t
 ) t1 where t1.rn=1

答案 2 :(得分:0)

我的理解是,您需要最旧的acct_crt_dt和app_start_dt以及较新的app_submit_dt。另外,如果出于某种原因您需要在单个字符串中列出app_ap列表,请使用listagg(在Oracle和Db2上受支持,我不知道在其他RDBMS上是否受支持):

select id, name, min(acct_cr_dt) as acct_cr_dt, listagg(app_ap,', ') as app_at,
   min(app_start_dt) as app_start_dt, max(app_submit_dt) as app_submit_dt
from t
group by id, name

但要小心以两种可能的情况:相同的ID具有不同的名称,并不同的ID相同的名称