SQL查询获取最大日期:新手求助关联表取最新值
Hey there! Let's work through this SQL problem together—since you're new to SQL, I'll break it down clearly so you can follow along.
问题概述
你有两张表,需要关联后获取每个客户最新LOADED_DATE对应的VALUE:
客户表(Customer Table)
| CUSTOMER ID | CUSTOMER JOIN DATE |
|---|---|
| 1234 | 01/03/2018 |
| 2345 | 21/07/2019 |
价值分段表(Value Segment)
| CUSTOMER ID | VALUE | LOADED_DATE |
|---|---|---|
| 1234 | HIGH | 01/09/20 |
| 1234 | MEDIUM | 01/10/20 |
| 2345 | LOW | 01/09/20 |
| 2345 | LOW | 01/10/20 |
你需要返回的结果是每个客户的ID、加入日期,以及他们最新加载日期对应的价值分段。
解决方案:使用窗口函数(ROW_NUMBER())
这是最直观的方法之一,适合新手理解。我们先给Value Segment表的每条记录按客户分组,然后按LOADED_DATE倒序排名,排名为1的就是每个客户最新的那条记录,再和客户表关联即可。
WITH LatestValue AS ( SELECT CUSTOMER_ID, VALUE, LOADED_DATE, -- 按客户分组,加载日期降序,给每条记录排名 ROW_NUMBER() OVER (PARTITION BY CUSTOMER_ID ORDER BY LOADED_DATE DESC) AS rn FROM Value_Segment ) SELECT c.CUSTOMER_ID, c.CUSTOMER_JOIN_DATE, lv.VALUE FROM Customer_Table c JOIN LatestValue lv ON c.CUSTOMER_ID = lv.CUSTOMER_ID WHERE lv.rn = 1; -- 只取每个客户排名第一的(最新的)记录
代码解释
- CTE(Common Table Expression)
LatestValue:我们先对价值分段表做处理,用ROW_NUMBER()函数给每个客户的记录排序——PARTITION BY CUSTOMER_ID表示按客户分组,ORDER BY LOADED_DATE DESC表示每组内按加载日期从新到旧排,这样最新的记录会得到rn=1。 - 关联客户表:把处理后的
LatestValue表和客户表通过CUSTOMER_ID关联,筛选出rn=1的记录,就能得到每个客户最新的价值分段。
预期结果
| CUSTOMER ID | CUSTOMER JOIN DATE | VALUE |
|---|---|---|
| 1234 | 01/03/2018 | MEDIUM |
| 2345 | 21/07/2019 | LOW |
注意事项
如果你的LOADED_DATE字段是字符串类型(不是数据库的DATE/DATETIME类型),可能需要先转换为日期类型再排序,比如在MySQL里可以用STR_TO_DATE(LOADED_DATE, '%d/%m/%y'),在SQL Server里用CONVERT(DATE, LOADED_DATE, 3),确保排序逻辑正确。
内容的提问来源于stack exchange,提问作者Mickeyog
相关产品推荐
相关产品推荐

