【发布时间】:2015-05-27 17:25:19
【问题描述】:
我有两个表(light 和 enhanced),它们的架构略有不同。第二个表 (enhanced) 有额外的可为空字段 t。
我想根据两个字段(d,p)从每个组的第一个和第二个表中获取行数
为了实现这一点,我使用带星号的子查询联合
select
d
, p
,count(1) - count(t) light_cnt
,count(t) enhanced_cnt
from
(select * from light)
, (select * from enhanced)
group by
d, p
但是这个查询返回错误的计数(大约是两倍) 只有当我按两个字段分组时才会发生这种情况。单场效果很好。我发现当我将联合包装在另一个子查询中时它可以正常工作
select
d
, p
,count(1) - count(t) light_cnt
,count(t) enhanced_cnt
from
(select * from
(select * from light)
, (select * from enhanced)
)
group by
d, p
这是一个错误还是我做错了什么?
编辑:
我在没有group by 的情况下重现了相同的损坏行为,只是使用了where
select count(1) from enhanced where p = 124
返回 292
select count(1) from light where p = 124
返回 12512
select count(1)
from (select * from light), (select * from enhanced)
where p = 124
返回正确的 12804,而
select count(1), count(t)
from (select * from light), (select * from enhanced)
where p = 124
返回 24527, 501... 很奇怪。似乎是一个错误。
解决方法:
select count(1), count(t)
from (select * from (select * from light), (select * from enhanced))
where p = 124
返回 12804、292。正确。
light 和 enhanced 两个表都具有从 avro 继承的复杂模式。有记录和重复字段。为简单起见,字段p 和t 在上面的选择中采用缩写形式。实数是p -> record.record.record.id(叶子是整数)和t -> record.time(叶子是整数)。路径 p 和 t 中的记录均不可重复。都可以为空。
【问题讨论】:
-
只是想调试一下。如果您只在两者中都执行 select count(*),那么计数之间是否存在差异?
-
表的结构是什么?任何重复/嵌套结构?
-
@sjuul 这两个表的简单计数:
select count(*) from light返回 50607517,enhanced返回 233162。而select sum(light_cnt) ,sum(enhanced_cnt) from([first query])返回 105536984 和 639161。从第二个查询中选择的总和是正确的。 -
@FelipeHoffa 是的,两个表都有嵌套和重复的结构。列的类型
d是从整数秒到时间戳,p是嵌套record.record.record.id整数,t也是嵌套record.time整数
标签: google-bigquery