例如,您有一个如下表
ID TaskID TaskName Status CaseID
1 1 a completed 101
1 2 a pending 102
1 3 b completed 103
1 4 c completed 104
如果要获取输出表,如
ID TaskID TaskName Status CaseID
1 4 c completed 104
1 3 b completed 103
您可以使用Impala SQL(实际问题将按ID进行大批量分组)
SELECT ID, TaskID, TaskName, Status, CaseID
FROM table
WHERE TaskID in (select MAX(TaskID) OVER (PARTITION BY ID) from table)
or TaskName = ‘b’
这在MySQL中有效,但是在Impala中会出现异常
AnalysisException: Subqueries in OR predicates are not supported
如何解决此OR异常问题?
答案 0 :(得分:1)
您可以将您的查询分解为2个查询,然后将结果进行并集,以避免对子查询或谓词的限制
SELECT ID, TaskID, TaskName, Status, CaseID
FROM table
WHERE TaskID in (select MAX(TaskID) OVER (PARTITION BY ID) from table where TaskName != 'b')
union all
SELECT ID, TaskID, TaskName, Status, CaseID
FROM table
WHERE TaskName = 'b'
答案 1 :(得分:0)
如果我理解正确,则可以使用not exists
:
SELECT ID, TaskID, TaskName, Status, CaseID
FROM table t
WHERE Status = 'completed' AND
NOT EXISTS (SELECT 1 FROM table t1 WHERE t1.TaskName = t.TaskName AND t1.Status = 'Pending');
如果我使用您的代码,那么我将使用相关子查询将其重写:
SELECT ID, TaskID, TaskName, Status, CaseID
FROM table
WHERE TaskID = (SELECT MAX(t1.TaskID) FROM table t1 WHERE t1.TaskName = t.TaskName) OR
TaskName = 'c';