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
相关产品推荐
相关产品推荐

