【发布时间】:2018-01-31 10:25:12
【问题描述】:
我正在尝试使用 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' 'lag' '(' 附近的输入;第 4 行 pos 9
注意事项:
- 我需要复杂的 'lag' 函数的原因是表中的唯一 ID 不是连续的,但我不认为这就是它所在的位置:我通过替换另一个更简单的内部查询进行测试并得到相同的错误消息.
- 说到“重复”,我在发布之前确实搜索过这个问题,但我发现 CASE 中唯一的 SELECT 是在 THEN 语句中,如果它的工作原理相同,则表明我的也应该工作。
【问题讨论】:
-
为什么要使用子查询?而不仅仅是
CASE WHEN LAG(blah) OVER (blah) = a.field_with_duplicates THEN ...? -
我能说什么。你是对的。做到了。我不敢尝试,因为我认为我需要整个查询来匹配索引。感谢您的建议。
标签: sql hive hiveql nested-queries