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

SQL/PySpark同一列多条件筛选:特定bal_type_id行选取需求

好的,我来帮你搞定这个需求!我们要筛选出bal_type_id=3的记录,但只有当同一个acc_no对应的bal_type_id=1的bal_amt大于0时才保留。下面分别给出SQL和PySpark的实现方案:

SQL解决方案

我们可以先用一个CTE(公共表表达式)找出所有符合条件的账户,再关联原表筛选目标行:

WITH valid_accounts AS (
    -- 先筛选出bal_type_id=1且余额大于0的账户编号
    SELECT acc_no
    FROM your_table
    WHERE bal_type_id = 1 AND bal_amt > 0
)
-- 关联原表,只保留bal_type_id=3且账户在有效列表中的记录
SELECT t.*
FROM your_table t
INNER JOIN valid_accounts va ON t.acc_no = va.acc_no
WHERE t.bal_type_id = 3;

这个逻辑很清晰:先锁定那些有有效主余额(bal_type1且>0)的账户,再从原表中挑出这些账户的bal_type3记录,完全符合你的预期输出。

PySpark解决方案

PySpark里我们可以用两种方式实现,小数据量和大数据量场景都能覆盖:

方法1:用isin(适合小数据集)

from pyspark.sql import functions as F

# 第一步:获取所有符合条件的acc_no
valid_accs = df.filter((F.col("bal_type_id") == 1) & (F.col("bal_amt") > 0)) \
               .select("acc_no") \
               .distinct()

# 把有效账户转成列表,用于筛选
valid_acc_list = [row.acc_no for row in valid_accs.collect()]

# 第二步:筛选目标行
result_df = df.filter((F.col("bal_type_id") == 3) & (F.col("acc_no").isin(valid_acc_list)))

# 查看结果
result_df.show()

方法2:用Join(适合大数据集,更高效)

如果数据量很大,collect()可能会占内存,这时候用关联查询更稳妥:

from pyspark.sql import functions as F

# 第一步:获取有效账户的数据集
valid_accs_df = df.filter((F.col("bal_type_id") == 1) & (F.col("bal_amt") > 0)) \
                  .select("acc_no") \
                  .distinct()

# 第二步:内关联筛选目标记录
result_df = df.join(valid_accs_df, on="acc_no", how="inner") \
              .filter(F.col("bal_type_id") == 3)

# 查看结果
result_df.show()

两种方法都能得到你想要的输出:排除掉acc_no125(没有bal_type1记录)和acc_no126(bal_type1余额为0)的bal_type3行,只保留acc_no123和124的对应记录。

内容的提问来源于stack exchange,提问作者Mohammad Sunny

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 14:12:55