删除列和列计数的冗余函数调用

Posted

技术标签:

【中文标题】删除列和列计数的冗余函数调用【英文标题】:Remove redundant function call for column and column's count 【发布时间】:2010-06-24 03:23:14 【问题描述】:

问题

在以下查询中,plr_stations 被调用了两次:

    一次限制WHERE子句;和 计算一次返回的结果数。

代码类似:

  SELECT
 m.*,
 s.*,
 (
  SELECT
    count(1)
  FROM
    climate.plr_stations('48.5146','-123.4447')
 ) AS count_stations
  FROM 
 climate.station s,
 climate.measurement m,
 (
  SELECT
    id
  FROM
    climate.plr_stations('48.5146','-123.4447')
 ) stations
  WHERE
    s.applicable AND
    s.id = stations.id AND
    m.station_id = s.id AND ...

此查询的结果然后按日期查询聚合。

解决方案

使用函数调用的结果填充临时表或数组变量。

更新 #1

如果在函数调用参数定义的球面多边形内有太多站点,函数调用将随机选择一个站点样本。

更新 #2

启动完整查询的日期查询聚合如下所示:

        SELECT 
          extract(YEAR FROM m.taken) AS year_taken,
          avg(m.amount) AS amount,
          count(m.amount) AS count_measurements,
          md.count_stations,
          min(md.elevation) AS elevation_min,
          max(md.elevation) AS elevation_max
        FROM
          climate.measurement m, (
          SELECT
            m.*,
            s.*, ...

问题

还有什么办法可以消除多余的调用?

谢谢。

【问题讨论】:

【参考方案1】:

怀疑它会折叠它,因为它不应该被标记为 IMMUTABLE(如果我理解这样的意图)。

这方面的东西应该工作...取决于您的要求...

with R_stations as (
SELECT
     id,   
     count(1) over () c
      FROM
        climate.plr_stations('48.5146','-123.4447')
)
     SELECT
     m.*,
     s.*,
     stations.c count_stations
      FROM 
     climate.station s,
     climate.measurement m,
     R_stations stations
      WHERE
        s.applicable AND
        s.id = stations.id AND
        m.station_id = s.id AND ...

但是考虑到您的聚合只是这样做可能会更容易......

 SELECT
 m.*,
 s.*,
 stations.c count_stations
  FROM 
 climate.station s,
 climate.measurement m,
 (SELECT
 id,   
 count(1) over () c
  FROM
    climate.plr_stations('48.5146','-123.4447')

) stations
      WHERE
        s.applicable AND
        s.id = stations.id AND
        m.station_id = s.id AND ...

【讨论】:

我认为您甚至可以摆脱该子选择并使其只是一个“stations.c”,但如果不运行它,我不是 100%。 (我做了这个改变。) 这里你不需要需要使用 WITH,它只是让 imho 更容易阅读。 @Dave Jarvis:如果您只是将我的查询中的 WITH (Select...) 更改为正常的派生部分,那么您应该能够适当地嵌入它。 是的,我可以完全删除WITH 子句并自然地嵌入子选择。再次感谢您。

以上是关于删除列和列计数的冗余函数调用的主要内容,如果未能解决你的问题,请参考以下文章

获取单元格的行和列,xlwings UDF在哪里被调用?

Python函数中多类型传值和冗余参数及函数的递归调用

python 用于ExcelPython函数的Python装饰器。避免由Excel刷新机制导致的冗余Python函数调用。

Hive 行转列和列转行

Python 装饰器计数函数调用

vtune 函数调用次数