模式判定(最高优先级,必须先执行)
汇总有两种互斥的聚合模式:1.一次聚合 2. 两次聚合
一次聚合是指:某个汇总列(一组汇总参数)只执行一次求值聚合算法,即将多条记录变单值的聚合算法,具体有:首位、末位、合计、最大、最小、计数、唯一计数、平均、连结。语法是:[汇总 {[条件 <过滤条件>] [<被聚合的计算式>] [求值聚合算法] [用] [命名 <新列名>]}] [分组 {[<分组计算式>] [命名 <新列名>]}]
两次聚合是指:某个汇总列(一组汇总参数)需要进行两次聚合,第一次是求记录聚合算法,即将多条记录变一条或同值的多条记录,具体有:最大者、最小者。比如订单金额最大的记录,当最大值不重复时结果是一条记录,当最大值重复时结果是多条。第一次聚合算法之后,需要立刻执行第二次的求值聚合算法(将多条记录变单值的聚合算法),才能算出最终结果。比如第一次聚合求出多条订单金额最大的记录,第二次聚合根据这些记录求金额的合计,完整算法是求订单金额最大的记录的金额合计。NLC的两次聚合类似SQL的keep函数。语法是:[汇总 {[条件 <过滤条件>] [<被聚合的计算式>] [求记录聚合算法] [<被聚合的计算式>] [求值聚合算法] [用] [命名 <新列名>]}] [分组 {[<分组计算式>] [命名 <新列名>]}]
判定规则(必须严格执行):
如果自然语言所表达出的聚合计算包括:最大者、最小者
→ 必须使用两次聚合。
相反,如果自然语言表达出的聚合计算没有:最大者、最小者,而是只有:首位、末位、合计、最大、最小、计数、唯一计数、平均、连结。
→ 必须使用一次聚合
如果同时出现或语义冲突:
→ 输出错误,不允许猜测
如果未明确表达最大者、最小者:
→ 默认使用一次聚合。
参数结构说明
本功能的参数由汇总、分组这两部分组成,汇总部分的参数名是"汇总",必须省略,是一组或多组同样结构的参数,每组参数表示一个汇总列,由5个(一次聚合)或7个参数(两次聚合)组成,其中,一次聚合的一组参数是:[条件 <过滤条件>] [<被聚合的计算式>] [求值聚合算法] [用] [命名 <新列名>];两次聚合的一组参数是:[条件 <过滤条件>] [<被聚合的计算式>] [求记录聚合算法] [<被聚合的计算式>] [求值聚合算法] [用] [命名 <新列名>]。分组部分的参数名是"分组",不能省略,也是一组或多组同样结构的参数,每组参数表示一个分组列,由2个参数组成,分别是:[<分组计算式>] [命名 <新列名>]。先说明汇总部分的参数。
参数说明
参数:被聚合的计算式
对组内数据进行聚合计算时,所针对的表达式,通常是与原列有关的表达式,含单列(属于计算式的一种)。比如:单价*数量,这是含有多个列的表达式;金额,这是单列。必要参数;类型是表达式;参数名必须省略,参数值不能省略。注意,本参数必须与参数求值聚合算法或求记录聚合算法同时用。某个汇总列如果进行一次聚合,则只有一个被聚合的计算式参数,如果进行两次聚合,则一定有两个被聚合的计算式参数。注意,本参数不支持跨行计算和聚合计算,即计算式里不能含有F[i]、F[a:b]形式的相对位置计算,也不能有集合的求和、平均等聚合计算。
参数: 求值聚合算法
对组内数据进行聚合,求出单个数值的固定算法。必要参数;枚举类型;参数名必须省略,参数值省略时,表示取任意一个成员。本参数必须和参数被聚合的计算式一起用。
各枚举值如下:
- 首位、末位:即第1项、最后1项,通常要事先排序才有意义。
- 合计、平均、唯一计数、最大、最小:按常识理解。
- 计数:按常识理解。本枚举值同样必须搭配被聚合的计算式,如果用户指令中没有明确的被聚合的计算式,则用行号字段#代替(也可以是任意字段名、任意常数),比如NLC:汇总 # 计数。
- 连结:用参数[用]当分隔符,将参数<被聚合的计算式>连结成一个大字符串。这是一个特殊的求值聚合算法。
例子:
求订单例子表的Amount量字段的最大值、Amount量字段的最小值。
NLC:汇总 Amount量 最大, Amount量 最小
结果:
最大Amount量 最小Amount量
20000 231
解释:"最大Amount量"和"最小Amount量"是汇总结果的列名,由系统自动生成,如果想指定列名,应该用参数命名 <新列名>。
参数: [用]
当参数求值聚合算法的值是"连结"时,由本参数指定连结所用的分隔符(字符串)。非必要参数,缺省值是空串"";字符串类型;参数名不能省略,参数值不能省略。注意,只有[求值聚合算法]的值是连结时才需要本参数,其他枚举值不需要本参数。
例子:
对订单例子表按SellerId字段分组,将各组的Client字段用逗号合并成一个大字符串,命名为新列"用户列表"
NLC:汇总 Client 连结; 用 ","; 命名 用户列表; 分组 SellerId
部分结果:
SellerId,用户列表
1,TAS,DSGC,GC,HU
3,JFS,NR,KT,JFE,RA
4,NR,EGH,WTC,RHD,ERN,GC
5,WVF,WZ,XY,PAER,SPLI,YZ,ERN,CHO,QU
参数: 求记录聚合算法
对组内数据进行聚合,求出单条记录或同值的多条记录的固定算法。必要参数;枚举类型;参数名必须省略,参数值可以省略。本参数一定是为了进行两次聚合,必须和参数被聚合的计算式一起用,必须和求值聚合算法一起用。
各枚举值如下:
最大者、最小者:参数被聚合的表达式最大或最小时所对应的记录(注意不是值),有多个同值的最大值时返回多条记录。
例子:
根据订单例子表求2个汇总值,订单日期最近的记录中的Amount量字段的最大值;Amount量字段的总额。
NLC:汇总 OrderDate 最大者 Amount量 最大, Amount量 合计
结果:
最大者OrderDate最大Amount量 合计Amount量
20000 4500000
解释:"最大者OrderDate最大Amount量"和"合计Amount量"是汇总结果的列名,由系统自动生成,如果想指定列名,应该用参数命名 <新列名>。
参数:条件 <过滤条件>
在聚合之前,可以先对分组后的记录进行过滤。非必要参数;类型是条件式;参数名不能省略。
例子:
过滤出符合条件式" OrderDate年=2019 或 OrderDate年=2020"的记录,再求Amount量的最大值
NLC: 汇总 条件 (OrderDate年=2019 或 OrderDate年=2020) ; Amount量 最大
结果:
OrderID ClientID SellerId 最大Amount量 OrderDate
87 WF 15 19000 2019-03-04
42 VET 12 19000 2020-04-08
参数:分组计算式
用于分组的表达式,可以是单字段(属于表达式的一种)。比如,计算出身份证字段的前6位,作为分组字段"区域"。对多个列分组时需要用多组参数,每组有一个分组列参数。必要参数(当有分组部分的参数时);类型为计算式;参数名必须省略。注意,本参数不支持跨行计算和聚合计算,即计算式里不能含有F[i]、F[a:b]形式的相对位置计算,也不能有集合的求和、平均等聚合计算。
例子:
将订单分析表按年份、ClientID分组,求各组Amount量字段的最大值和最小值。
NLC:汇总 Amount量 最大, Amount量 最小; 分组 年份, ClientID
结果:
年份 ClientID 最大Amount量 最小Amount量
2019 WF 19000 2100
2020 WF 12800 2200
2021 WF 14100 1300
2019 TEF 13000 2200
2020 ETF 23000 3100
参数:命名 <新列名>
汇总结果和分组列可以由系统自动命名新列名,也可用本参数指定。非必要参数;类型是(列)标识;参数名不能省略。注意,分组部分和汇总部分有同名的本参数,意义和用法类似。
例子:
求订单例子表的Amount量字段的最大值、最小值,分别命名为大订单金额、小订单金额。
NLC:汇总 Amount量 最大 命名 大订单金额, Amount量 最小 命名 小订单金额
结果:
大订单金额 小订单金额
20000 231
注意:如果省略参数命名 <新列名>,则表示由系统自动命名。