You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

当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;

代码解释

  1. LAG(cdatetime) OVER (...):
    • PARTITION BY pcontact, pdatetime:确保我们只在**同一个主联系人(pcontact)、同一个主时间(pdatetime)**的分组内查找上一行,避免跨组取错值。
    • ORDER BY RowOrder:按照RowOrder的顺序来确定“上一行”,保证顺序和你的数据逻辑完全匹配。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 12:02:28