使用WHERE子句在BigQuery中编写相关子查询时,会导致错误。 如果没有连接两端的字段相等的条件,则不能使用LEFT OUTER JOIN。
但是它可以在其他SQL引擎中使用,我不了解该错误或如何重写查询。
相同类型的不同查询会导致相同错误。
SELECT
out.*
FROM
`august-monolith-205810.Assignment.students` AS out
WHERE
2 >= (
SELECT
COUNT(*)
FROM
`august-monolith-205810.Assignment.students` AS t1
WHERE
out.age < t1.age)
报告比其他两个学生大的学生。
答案 0 :(得分:3)
以下是用于BigQuery标准SQL
#standardSQL
SELECT * EXCEPT(cnt)
FROM (
SELECT *, COUNT(1) OVER(ORDER BY age RANGE BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) cnt
FROM `august-monolith-205810.Assignment.students`
)
WHERE cnt BETWEEN 1 AND 2
另一种效果不佳,因此不推荐使用,但仍然可以选择使用CROSS JOIN模仿非等距的LEFT JOIN
#standardSQL
SELECT ANY_VALUE(out).*
FROM `august-monolith-205810.Assignment.students` AS out
CROSS JOIN `august-monolith-205810.Assignment.students` AS t1
WHERE out.age > t1.age
GROUP BY out.id
HAVING COUNT(t1.age) <= 2
答案 1 :(得分:0)
您正在尝试做的可怕的事情,但是让我们考虑一下您拥有什么。对于每个“ OUT”记录,您都在重新查询每个分配以获取计数。我建议的是3级查询。最内层是获取所有不同的“年龄”值(基于跳跃整数)。然后获得小于LESS的计数,而不是创建预汇总结果。然后,您可以基于最外面的OUT值与重复查询来加入到原始输出。像
select
out
from
`august-monolith-205810.Assignment.students` AS out
JOIN ( select
UniqAge.Age,
( SELECT COUNT(*)
FROM `august-monolith-205810.Assignment.students`
WHERE age < UniqAge.age) CountUnderAge
from
( select distinct age
from `august-monolith-205810.Assignment.students` ) UniqAge
) PQByAge
on out.age = PQByAge
AND PQByAge.CountUnderAge <= 2
此查询基于“年龄”列基于整数(非十进制)。