我注意到 bigquery 标准 sql 中有一个奇怪的错误。我有一张桌子:
SELECT * FROM ds.sod;
| id | name |
|----+-------|
| 1 | tom |
| 2 | dick |
| 3 | harry |
Run Code Online (Sandbox Code Playgroud)
因此,如果我按 exporession 分组它会起作用
SELECT MOD(id,2) AS oddeven, COUNT(1) AS cnt
FROM ds.sod GROUP BY MOD(id,2)
| oddeven | cnt |
+---------+-----+
| 1 | 2 |
| 0 | 1 |
Run Code Online (Sandbox Code Playgroud)
但是如果我添加一个 HAVING 子句,它就会失败。
SELECT MOD(id,2) AS oddeven, COUNT(1) AS cnt
FROM ds.sod GROUP BY MOD(id,2) HAVING COUNT(1) > 0
ERROR: SELECT list expression references column id which is neither grouped nor aggregated
Run Code Online (Sandbox Code Playgroud)
现在奇怪的是,如果我不为列设置别名
SELECT MOD(id,2), COUNT(1) AS cnt
FROM ds.sod GROUP BY MOD(id,2) HAVING COUNT(1) > 0
| f0_ | cnt |
+-----+-----+
| 1 | 2 |
| 0 | 1 |
Run Code Online (Sandbox Code Playgroud)
如果我不使用函数,它也适用于别名
SELECT id AS oddeven, COUNT(1) AS cnt
FROM ds.sod GROUP BY id HAVING COUNT(1) > 1
| oddeven | cnt |
+---------+-----+
| 3 | 1 |
| 2 | 1 |
| 1 | 1 |
Run Code Online (Sandbox Code Playgroud)
难道我做错了什么?或者这是 bigquery 标准 SQL 解析中的错误?
编辑:刚刚注意到如果我按别名分组它确实有效(我从未做过的事情因为在 oracle 7 中不起作用)
SELECT MOD(id,2) AS oddeven, COUNT(1) AS cnt
FROM ds.sod GROUP BY oddeven HAVING COUNT(1) > 0
| oddeven | cnt |
+---------+-----+
| 1 | 2 |
| 0 | 1 |
Run Code Online (Sandbox Code Playgroud)
或者您可以使用列位置
with
sample_data as (
select
*
from
unnest(
array[
struct(1 as id, 'tom' as name),
struct(2, 'dick'),
struct(3, 'harry')
]
)
)
select
mod(id, 2) as oddeven,
count(*) as cnt
from
sample_data
group by
1
having
count(*) > 0
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
902 次 |
最近记录: |