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

如何基于条件移除PySpark DataFrame中的特定Null值?

移除重复ID+订阅计划对应的Null付费频率记录

原始表 user_info

user_info
+------+------------------+---------------------+
| id   | subscription_plan| payment_frequency   |
+------+------------------+---------------------+
| 3004 |   Netflix        | Monthly             |
| 3004 |   Disney +       | Monthly             |
| 3004 |   Netflix        | Null                |
| 3006 |   Star +         | Yearly              |
| 3006 |   Apple TV       | Yearly              |
| 3006 |   Netflix        | Monthly             |
| 3006 |   Star +         | Null                |
| 3009 |   Apple TV       | Null                |
| 3009 |   Star +         | Monthly             |
+------+------------------+---------------------+

需求说明

需要精准删除特定Null记录:

  • 当同一个id和subscription_plan存在多条记录时,删除其中payment_frequency为Null的那条
  • 如果某个id+subscription_plan组合只有一条记录,哪怕payment_frequency是Null也要保留(比如ID 3009的Apple TV记录)

不能直接删除所有payment_frequency为Null的记录,否则会误删需要保留的唯一Null记录。

解决方案

方法1:使用窗口函数(适用于MySQL 8+、PostgreSQL、SQL Server等支持窗口函数的数据库)

DELETE FROM user_info
WHERE (id, subscription_plan, payment_frequency) IN (
    SELECT id, subscription_plan, payment_frequency
    FROM (
        SELECT 
            id,
            subscription_plan,
            payment_frequency,
            -- 统计每个id+订阅计划组合的记录数
            COUNT(*) OVER (PARTITION BY id, subscription_plan) AS record_count
        FROM user_info
    ) temp
    -- 只删除重复组合里的Null记录
    WHERE record_count > 1 AND payment_frequency IS NULL
);

方法2:使用EXISTS子查询(兼容性更强,适用于多数数据库)

DELETE FROM user_info u1
-- 目标是Null记录
WHERE u1.payment_frequency IS NULL
-- 同时存在同id+订阅计划的非Null记录
AND EXISTS (
    SELECT 1
    FROM user_info u2
    WHERE u2.id = u1.id
      AND u2.subscription_plan = u1.subscription_plan
      AND u2.payment_frequency IS NOT NULL
);

两种方法逻辑一致:只清除那些有“替代项”的Null记录,保留没有重复的唯一Null记录。

执行后期望结果

user_info
+------+------------------+---------------------+
| id   | subscription_plan| payment_frequency   |
+------+------------------+---------------------+
| 3004 |   Netflix        | Monthly             |
| 3004 |   Disney +       | Monthly             |
| 3006 |   Star +         | Yearly              |
| 3006 |   Apple TV       | Yearly              |
| 3006 |   Netflix        | Monthly             |
| 3009 |   Apple TV       | Null                |
| 3009 |   Star +         | Monthly             |
+------+------------------+---------------------+

内容的提问来源于stack exchange,提问作者Marcos Dias

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 11:46:02