Hive - 在CASE函数的WHEN子句中选择SELECT会出错

时间:2018-01-31 10:25:13

标签: sql hive hiveql nested-queries

我正在尝试使用Case语句在Hive中编写查询,其中条件取决于当前行中的一个值(无论它是否等于其前一个值)。我想以这种方式动态评估它,因此需要嵌套查询,而不是先将其作为另一列并比较2列。 (我能够做到后者,但那确实是第二好的)。有谁知道如何使这项工作? 感谢。

我的查询:

SELECT * ,
CASE 
    WHEN  
        (SELECT lag(field_with_duplicates,1)  over (order  by field_with_duplicates) FROM my_table b
        WHERE b.id=a.id)  =  a.field_with_duplicates
        THEN “Duplicate”
        ELSE “” 
END as Duplicate_Indicator
FROM my_table a


错误:

java.sql.SQLException:org.apache.spark.sql.AnalysisException:无法识别' SELECT'附近的输入'延迟' '('在表达式规范中;第4行pos 9

注意:

  • 我之所以需要复杂的“延迟”。功能是表中的唯一ID不是连续的,但我不认为它在哪里:我通过替换另一个更简单的内部查询进行测试并得到相同的错误消息。
  • 说到'复制',我在发布之前就确实在这个问题上进行了搜索,但是我发现CASE中唯一的SELECT是在THEN语句中,如果有效的话同样,它表明我的也应该工作。

2 个答案:

答案 0 :(得分:0)

您不需要CASE中的子查询:

SELECT a.* ,
     CASE 
         WHEN  prev_field_with_duplicates = field_with_duplicates 
         THEN “Duplicate”
         ELSE “” 
     END as Duplicate_Indicator
FROM (select a.*,
             lag(field_with_duplicates,1)  over (order  by field_with_duplicates) as prev_field_with_duplicates 
        from my_table a
     )a

甚至你可以在CASE中使用lag()而不使用子查询(我不确定它是否适用于所有Hive版本):

 CASE 
     WHEN  lag(field_with_duplicates,1)  over (order  by field_with_duplicates) = field_with_duplicates 
     THEN “Duplicate”
     ELSE “” 
 END as Duplicate_Indicator

答案 1 :(得分:0)

感谢@MatBailie在评论中给出答案。我不觉得傻...
解决