繁体   English   中英

如何 select 行基于特定列的公共值的条件?

[英]How to select rows based on a condition for a common value of a specific column?

对不起,标题混乱,我不知道如何清楚地表达出来。

这就是我想要使用 PySpark SQL 完成的工作:

当变量“Z”的值介于 2000 和 3000 之间时,返回该特定 ID 的行,但仅返回变量 Y 和 Z 的数据。

我不知道如何 go 比下面的查询更进一步,如何让 SQL 知道我们需要在附加的 df 中选择正确的 ID(2 和 3)?

 SELECT ID, Variable, Date, Value 
 FROM TABLE 
 WHERE (Variable == 'Y' OR Variable == 'Z') AND "if Value of Z between 2000 and 3000 then select only these IDs"

顶部是df,底部是预期结果

尝试使用简单的内部查询

 SELECT ID, Variable, Date, Value 
 FROM TABLE 
 WHERE (Variable == 'Y' OR Variable == 'Z') AND ID in (select id from TABLE where variable = 'Z' and value between 2000 and 3000)

在 Spark 中,我建议使用 window 函数:

select t.*
from (select t.*,
             sum(case when variable = 'Z' and z_value between 2000 and 3000 then 1 else 0 end) over (partition by id) as z_value_cnt
      from t
     ) t
where variable in ('Y', 'Z') and z_value_cnt >= 1;

我希望这会有更好的执行计划。

df=spark.createDataFrame([(1,'X', '01/01/20',5),
                      (1,'Y', '01/01/20',10),
                      (1,'Z', '01/01/20',1000),
                      (2,'X', '01/02/20',20),
                      (2,'Y', '01/02/20',30),
                      (2,'Z', '01/02/20',2500)],['ID','VAR','DATE','VAL'])
display(df.filter("VAL Between 2000 and 3000").select('ID').join(df,['ID']).filter("VAR in ('X','Y')"))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM