文章 cheng yu · 1 小时 前 2m read

示例——稀疏数据的全局变量

在 OEX 上浏览我的包时,我想起了一个
关于SQL主机变量的示例。 

您可能看过我关于《Open Exchange Reviews》的系列文章
每条报告行都会被分配一个系列编号(末尾的 #76)
一旦发布,我就不再太关注它了。 
我只关注最后那份尚未发布的、带有 MAX(serial) 的报告。
简单思路:

SELECT serial,label, . . . from oex.dir WHERE serial = MAX(serial)

哎呀:: SQLCODE=-19
   聚合函数不能用于WHERE或GROUP BY子句中  
此外:对每个“serial”的出现位置都运行MAX(),性能并不理想。 
我当时想找一种方法,计算出一个静态值来与之进行比较。
因此,我编写了一个名为 SMX 的自定义静态 SQL 方法,如下所示:

ClassMethod SMX(dif As %Integer = 0) As %Integer [ SqlName = SMX, SqlProc ]
{
 set max=$g(^||max,0)
 if 'max {
    &sql(SELECT max(serial) into :max from oex.dir)
    set ^||max=max
 }
 quit max+dif
}

以及相关的 SELECT 语句

SELECT serial,label, . . . from oex.dir WHERE serial=oex.SMX()

现在它运行效果如预期 
说明:

  • 该附加参数允许相对于 MAX 进行一定偏移
  • 该方法是静态的,因为调用时未将任何列名作为参数传入
  • 该值存储在一个仅存在于您进程内的 PPG 中
    • 它不会在日志中留下任何痕迹
    • 该值仅在您的流程内计算一次

在实际应用中,这可能适用于以下所有情况:
需要按天、周……等单位统计多条记录的情况,