我有一个问题,就像这样

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 
            from ACCOUNT
LEFT JOIN CLIENT ON CAST (CLIENT.client_number AS NUMERIC) = ACCOUNT.client_number
)
select 
CLIENT_NUMBER,
CLIENT_CREATE_DATE,
ACCOUNT_CREATE_DATE,
'' NEW_CLIENT_DATE
FROM CTE
ORDER BY CLIENT_NUMBER

我得到的结果是:

CLIENT_NUMBER   CLIENT_CREATE_DATE  ACCOUNT_CREATE_DATE     NEW_CLIENT_DATE
5                   1/10/2014           8/21/2001                
7                   1/10/2014           3/24/2010   
7                   1/10/2014           10/31/2011  
13                  1/10/2014           4/5/2012    
16                  1/10/2014           10/16/2003  
16                  1/10/2014           6/14/2022   
16                  1/10/2014           8/24/2011   
17                  1/10/2014           11/12/2014  
17                  1/10/2014           12/10/2014  
18                  1/10/2014           10/23/2003  

如何确定每个客户端的最早日期并将其插入到"NEW_CLIENT_DATE"列?目标是将每个客户端的"CLIENT_CREATE_DATE"与所有关联的"ACCOUNT_CREATE_DATE"值进行比较.如果"CLIENT_CREATE_DATE"是最小的,则将其设置为"NEW_CLIENT_DATE";否则,将其设置为该客户端的最小"ACCOUNT_CREATE_DATE".我已try 使用CTE并try 分区,但我不确定如何继续.有没有人能指导我或提供解决方案?

输出应如下所示:

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

推荐答案

我们可以在这里使用窗口函数和CASE个逻辑:

SELECT 
    CLIENT_NUMBER,
    CLIENT_CREATE_DATE,
    ACCOUNT_CREATE_DATE,
    CASE WHEN CLIENT_CREATE_DATE < MIN(ACCOUNT_CREATE_DATE) OVER (PARTITION BY CLIENT_NUMBER)
         THEN CLIENT_CREATE_DATE
         ELSE MIN(ACCOUNT_CREATE_DATE) OVER (PARTITION BY CLIENT_NUMBER) END AS NEW_CLIENT_DATE
FROM CTE
ORDER BY CLIENT_NUMBER;

Sql相关问答推荐

如何更改函数返回的列名?

解析键-值对,根据值 Select ,并使用SQL创建新列

SQL:如何将相应位置的两个数组中的元素组合在一起

SQL递归.硬币兑换问题.-try 使用递归解决硬币找零问题

在 Oracle 21c 中透视文本值

如何解释 SQL Server 中的 Foxpro 语法?

清理 XML 数据

按公司和产品查询最近发票的平均价格的SQL查询

在自引用表中使用分组和计数的SQL查询语句

根据开始时间和结束时间计算has_impact字段

为什么在事务中未被后续使用的CTE执行SELECT...FOR UPDATE无效?

使用 regexp_replace 替换所有出现的特殊字符

字符串从更改到表列和查询中的一行的转换错误

SQL:如何从时间戳数据生成时间序列并计算不同事件类型的累计总和?

我需要遍历权重值表并确定每个权重是否有效

为什么 Oracle 在一个查询中对同一张表同时执行 TABLE SCAN 和 INDEX UNIQUE SCAN?

使用一组值进行分组和计数

使用 SQL 表中的连接列删除重复记录

在 UTF 编码字符上应用 SQL LIKE 语句没有给出任何结果

遍历数据,计算每个月最后三天的总和