SQL查询中如何为每个客户确定最早日期并填充至NEW_CLIENT_DATE列
解决方案:为客户计算最早日期并填充NEW_CLIENT_DATE列
需求说明
需要为每个客户确定最早日期并填入NEW_CLIENT_DATE列:比较该客户的CLIENT_CREATE_DATE与所有关联的ACCOUNT_CREATE_DATE值,取两者中的最小值作为该客户所有行的NEW_CLIENT_DATE。
修改后的SQL语句
WITH CTE AS ( SELECT CLIENT.client_number AS CLIENT_NUMBER, CAST(CLIENT.create_date AS DATE) AS CLIENT_CREATE_DATE, CAST(ACCOUNT.account_open AS DATE) AS ACCOUNT_CREATE_DATE, -- 按客户分组,计算该客户所有账户的最早开户日期 MIN(CAST(ACCOUNT.account_open AS DATE)) OVER (PARTITION BY CLIENT.client_number) AS MIN_ACCOUNT_DATE FROM ACCOUNT LEFT JOIN CLIENT ON CAST(CLIENT.client_number AS NUMERIC) = ACCOUNT.client_number ) SELECT CLIENT_NUMBER, CLIENT_CREATE_DATE, ACCOUNT_CREATE_DATE, -- 取客户创建日期和最早账户日期中的较小值 CASE WHEN CLIENT_CREATE_DATE < MIN_ACCOUNT_DATE THEN CLIENT_CREATE_DATE ELSE MIN_ACCOUNT_DATE END AS NEW_CLIENT_DATE FROM CTE ORDER BY CLIENT_NUMBER;
逻辑解释
- 在CTE中新增
MIN_ACCOUNT_DATE字段:通过窗口函数MIN() OVER (PARTITION BY CLIENT.client_number)按客户编号分组,计算每个客户名下所有账户的最早开户日期。 - 主查询用
CASE语句对比CLIENT_CREATE_DATE和MIN_ACCOUNT_DATE,取更小的日期填充NEW_CLIENT_DATE,确保同一客户的所有行显示相同的最早日期。
执行结果
执行该语句后将得到期望输出:
CLIENT_NUMBER CLIENT_CREATE_DATE ACCOUNT_CREATE_DATE NEW_CLIENT_DATE 5 1/10/2014 8/21/2001 8/21/2001 7 1/10/2014 3/24/2010 3/24/2010 7 1/10/2014 10/31/2011 3/24/2010 13 1/10/2014 4/5/2012 4/5/2012 16 1/10/2014 10/16/2003 10/16/2003 16 1/10/2014 6/14/2022 10/16/2003 16 1/10/2014 8/24/2011 10/16/2003 17 1/10/2014 11/12/2014 1/10/2014 17 1/10/2014 12/10/2014 1/10/2014 18 1/10/2014 10/23/2003 10/23/2003
内容的提问来源于stack exchange,提问作者kunz
相关产品推荐
相关产品推荐

