Oracle SQL如何从同表拆分数据并关联最新记录生成租户地址
解决apartment_Table地址拼接的SQL问题
不需要用LISTAGG,LISTAGG是用来把同组的多条记录值拼串的,你的需求是分别获取每个ID下最新的CO(公寓号)和WK(道路名),属于行转列的场景,用窗口函数+条件聚合或者PIVOT就能搞定。
具体修正思路
- 先给每个ID的不同code类型(WK/CO)标记最新记录:用
ROW_NUMBER()窗口函数,按ID+code分组,按update_Date倒序排序,排名为1的就是该类型的最新数据。 - 将WK和CO的最新值转为同一行的两个字段,再结合城市、州、邮编拼接完整地址。
示例SQL(条件聚合写法,兼容性更强)
SELECT id, MAX(CASE WHEN code = 'CO' AND rn = 1 THEN value END) AS latest_apartment_no, MAX(CASE WHEN code = 'WK' AND rn = 1 THEN value END) AS latest_street_name, city, state_code, zip_code, -- 按需调整地址拼接格式 CONCAT(MAX(CASE WHEN code = 'WK' AND rn = 1 THEN value END), ' ', MAX(CASE WHEN code = 'CO' AND rn = 1 THEN value END), ', ', city, ' ', state_code, ' ', zip_code) AS tenant_address FROM ( SELECT id, code, value, -- 替换为你表中存道路名/公寓号的实际字段 city, state_code, zip_code, update_date, ROW_NUMBER() OVER (PARTITION BY id, code ORDER BY update_date DESC) AS rn FROM apartment_Table ) t WHERE rn = 1 GROUP BY id, city, state_code, zip_code;
用PIVOT的写法(适合Oracle、SQL Server等支持PIVOT的数据库)
SELECT id, latest_apartment_no, latest_street_name, city, state_code, zip_code, CONCAT(latest_street_name, ' ', latest_apartment_no, ', ', city, ' ', state_code, ' ', zip_code) AS tenant_address FROM ( SELECT id, code, value, city, state_code, zip_code, ROW_NUMBER() OVER (PARTITION BY id, code ORDER BY update_date DESC) AS rn FROM apartment_Table ) t PIVOT ( MAX(value) FOR code IN ('CO' AS latest_apartment_no, 'WK' AS latest_street_name) ) WHERE rn = 1;
注意事项
- 把SQL里的
value替换成你表中实际存储道路名、公寓号的字段名 - 地址拼接的格式可以根据业务需求调整,比如增减分隔符、调整字段顺序
内容的提问来源于stack exchange,提问作者Lyon
相关产品推荐
相关产品推荐

