hive-select inside when子句出现错误

j5fpnvbx  于 2021-06-26  发布在  Hive
关注(0)|答案(2)|浏览(389)

我试图在配置单元中用case语句编写一个查询,其中条件取决于当前行中的一个值(不管它是否等于它的前一个值)。我想用这种方式动态地计算它,因此需要一个嵌套查询,而不是先让它成为另一列,然后比较两列(我能做到后者,但那真的是第二好)。有人知道怎么做吗?谢谢。

我的问题:

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”“lag”“(”附近的输入;4号线位置9

注意事项:

我之所以需要复杂的'lag'函数,是因为表中的唯一id不是连续的,但我不认为它是在哪里:我通过替换另一个更简单的内部查询进行测试,得到了相同的错误消息。
说到“重复”,我在发布之前确实搜索过这个问题,但我找到的唯一select的inside case是在then语句中,如果这是一样的话,它建议我的也应该可以。

00jrzges

00jrzges1#

感谢@matbailie在他的评论中给出了答案。我不觉得傻。。。
断然的

wfypjpf4

wfypjpf42#

您不需要在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(),而不使用子查询(我不确定它是否适用于所有配置单元版本):

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

相关问题