【问题标题】:SQL Logic for generating new column based Matching field values用于生成基于新列的匹配字段值的 SQL 逻辑
【发布时间】:2020-02-19 16:14:43
【问题描述】:
Input:
CUST TAX_TYPE 
a      TIN    
a      TIN    
a      SSN    
b      TIN    
b      TIN     
b      TIN    
c      SSN    
c      SSN    
c      null
Output:
CUST TAX_TYPE VALID 
a      TIN     n
a      TIN     n
a      SSN     n
b      TIN     y
b      TIN     y 
b      TIN     y
c      SSN     n
c      SSN     n
c      null    n

如果同一个 CUST 有多个 TAX_TYPE,我应该将其标记为“n”,否则如果同一个 CUST 具有相同的 tax_type,我应该在 VALID 列中将其标记为“y”。任何人都可以为这种情况建议优化的 spark-sql 或标准 sql(以便我可以转换为 spark sql 查询)逻辑查询

【问题讨论】:

    标签: sql apache-spark-sql hiveql


    【解决方案1】:

    使用case 和窗口函数:

    select t.*,
           (case when min(TAX_TYPE) over (partition by cust) = max(tax_type) over (partition by cust) and
                      count(*) over (partition by cust) = count(tax_type) over (partition by cust)
                 then 'y' else 'n'
            end) as valid
    from t;
    

    第二个条件是验证没有NULL 值。

    【讨论】:

    • 谢谢你的逻辑,它消除了我们现在用来解决这个问题的连接
    【解决方案2】:

    尝试使用when-otherwise 来实现所需的输出

    scala> import org.apache.spark.sql.expressions.Window
    
    scala> var df =Seq(("a", "TIN" ), ("a", "TIN" ), ("a", "SSN" ), ("b", "TIN" ), ("b", "TIN" ), ("b", "TIN" ), ("c", "SSN" ), ("c", "SSN" ), ("c","null")).toDF("cust","tax_type")
    
    scala> df.withColumn("valid",when(size(collect_set(col("tax_type")).over(Window.partitionBy(col("cust")).orderBy(col("cust"))))>1,"N").otherwise("Y")).orderBy("cust").show()
    +----+--------+-----+
    |cust|tax_type|valid|
    +----+--------+-----+
    |   a|     TIN|    N|
    |   a|     SSN|    N|
    |   a|     TIN|    N|
    |   b|     TIN|    Y|
    |   b|     TIN|    Y|
    |   b|     TIN|    Y|
    |   c|     SSN|    N|
    |   c|     SSN|    N|
    |   c|    null|    N|
    +----+--------+-----+
    

    它将避免每一行的所有最小/最大计算。

    【讨论】:

      猜你喜欢
      • 2013-09-28
      • 1970-01-01
      • 2019-12-04
      • 1970-01-01
      • 1970-01-01
      • 2016-05-21
      • 2017-01-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多