网格查询中的聚集表达式

网格查询中的聚集表达式要求发出网格查询的数据库服务器从多网格服务器组合聚集结果。

网格查询是在数据库服务器的限定的行上返回逻辑 UNION 或 UNION ALL 的分布式 SELECT 语句,这些表在 GBase 8s 网格的数据库中有相同的模式。在 GRID 子句 主题和在 GBase 8s Enterprise Replication 指南 中描述网格查询。

网格查询中的聚集表达式要求发出该网格查询的数据库服务器组合来自多网格服务器的聚集结果。由于您指定的网格查询转换为跨多网格服务器的 UNION 或 UNION ALL 查询,因此,在指定的网格或区域内在每一参与的服务器上独立地计算每一聚集。将这些单独的聚集返回到发出该网格查询的数据库服务器,其计算它们的组合的 UNION 或 UNION ALL 值。

为了从这些单独的聚集计算全局的聚集,该网格查询必须是子查询。例如,假设我们想要查看东南地区(下列示例中的 SW_USA)的总销售额和平均销售额。因为如果在该网格内跨数据集的限定的行值的数目不同,则采用平均组的平均值是不正确的,因此正确的网格查询需要类似这样:

SELECT SUM(amt) AS total_sales , 
            SUM(amt) / SUM(cnt) AS avg_sale FROM
            (
            SELECT COUNT(*) cnt, SUM(amt) amt
            FROM sales GRID ALL 'SW_USA'
            );
            
            total_sales         avg_sale
            
            $8300.00          $103.75

在此示例中,网格查询的 projection 列表指定来自东南地区(编码为 'SW_USA')内每一网格数据库的 sales 表的 COUNT(*) 表达式(别名为 cnt)和聚集数量 SUM(amt)(别名为 amt)。使用来自每一远程网格服务器的这些值,本地的网格服务器可计算该地区的平均值。通过把求值表达式 SUM(amt) 的总销售额加起来,并将那个值除以总计数 SUM(cnt) 来实现,此处,cntamt 是网格子查询的结果集中的列。

请注意,GRID ALL 关键字指定来自每一参与的网格服务器的限定的行的 UNION ALL,来避免消除重复的行。