当cdatetime字段值为NULL时,如何获取数据表中上一行的对应值?
解决cdatetime为NULL时填充上一行值的问题
嘿,你的需求其实用SQL的窗口函数就能轻松搞定!你之前尝试CASE语句的方向没错,但结合LAG()函数会更直接高效。
核心思路
LAG()是窗口函数的一种,它能帮你获取当前行在指定排序规则下的上一行的指定字段值。结合COALESCE()(或者你熟悉的CASE语句),就能在cdatetime为NULL时自动用上一行的有效值来填充。
具体实现代码
假设你的表名为contact_table,可以用下面的SQL语句:
SELECT pcontact, ccontact, RowOrder, -- 如果cdatetime不为空就用自身,为空就用上一行的cdatetime COALESCE(cdatetime, LAG(cdatetime) OVER (PARTITION BY pcontact, pdatetime ORDER BY RowOrder)) AS filled_cdatetime, pdatetime FROM contact_table;
代码解释
LAG(cdatetime) OVER (...):PARTITION BY pcontact, pdatetime:确保我们只在**同一个主联系人(pcontact)、同一个主时间(pdatetime)**的分组内查找上一行,避免跨组取错值。ORDER BY RowOrder:按照RowOrder的顺序来确定“上一行”,保证顺序和你的数据逻辑完全匹配。
COALESCE():这个函数会依次返回第一个非NULL的值,所以如果当前行的cdatetime不为空就用它,为空就用LAG拿到的上一行值。
用CASE语句实现的写法
如果你更倾向于用CASE语句来完成,也可以这样写:
SELECT pcontact, ccontact, RowOrder, CASE WHEN cdatetime IS NOT NULL THEN cdatetime ELSE LAG(cdatetime) OVER (PARTITION BY pcontact, pdatetime ORDER BY RowOrder) END AS filled_cdatetime, pdatetime FROM contact_table;
这个效果和用COALESCE完全一致,看你个人习惯选择就行~
内容的提问来源于stack exchange,提问作者Rajesh
相关产品推荐
相关产品推荐

