我正在尝试使用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
答案 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在评论中给出答案。我不觉得傻...
解决