如何在SQL中获取每行最后一个非空的所有权变更日期?
每行取最后一个非空所有权变更日期的解决方案
核心思路
直接从最靠后的所有权变更日期列往前判断,返回第一个非空值——这个值就是该车辆最后一次所有权变更的日期。这种方法不需要修改表结构,且对百万级数据的性能友好。
各数据库具体实现
假设你的所有权变更日期列名为 owner_change_1, owner_change_2, ..., owner_change_N(数字越大对应越晚的变更记录),以下是主流数据库的写法:
MySQL/MariaDB
使用COALESCE函数,它会返回传入参数中第一个非空值:
SELECT vehicle_id, COALESCE(owner_change_N, owner_change_N-1, ..., owner_change_2, owner_change_1) AS last_owner_change_date FROM your_vehicle_table;
把实际列名按从最新到最早的顺序填入COALESCE即可,比如有6个列就写COALESCE(owner_change_6, owner_change_5, owner_change_4, owner_change_3, owner_change_2, owner_change_1)。
SQL Server
同样用COALESCE,写法和MySQL一致:
SELECT vehicle_id, COALESCE(owner_change_N, owner_change_N-1, ..., owner_change_2, owner_change_1) AS last_owner_change_date FROM your_vehicle_table;
PostgreSQL
PostgreSQL原生支持COALESCE,写法完全相同:
SELECT vehicle_id, COALESCE(owner_change_N, owner_change_N-1, ..., owner_change_2, owner_change_1) AS last_owner_change_date FROM your_vehicle_table;
注意事项
- 务必确认列的顺序:如果列名的数字不是对应变更顺序,需要先理清每个列对应的变更时间,再调整
COALESCE里的参数顺序(最新的列放最前面)。 - 该方法是行内运算,不需要表关联或子查询,百万级数据量下执行效率很高,不会有性能瓶颈。
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

