database.aggregate(name, options)


在 SQLite 数据库中注册一个新的聚合函数。此方法是 sqlite3_create_window_function() 的封装。

【Registers a new aggregate function with the SQLite database. This method is a wrapper around sqlite3_create_window_function().】

  • name <string> 要创建的 SQLite 函数的名称。
  • options <Object> 功能配置设置。
    • deterministic <boolean> 如果为 true,则在创建的函数上设置 SQLITE_DETERMINISTIC 标志。默认值: false
    • directOnly <boolean> 如果为 true,则在创建的函数上设置 SQLITE_DIRECTONLY 标志。默认值: false
    • useBigIntArguments <boolean> 如果为 true,则传给 options.stepoptions.inverse 的整数参数会被转换为 BigInt。如果为 false,整数参数会作为 JavaScript 数字传递。默认值: false
    • varargs <boolean> 如果为 trueoptions.stepoptions.inverse 可以使用任意数量的参数(从零到 SQLITE_MAX_FUNCTION_ARG)调用。如果为 falseinversestep 必须使用准确的 length 个参数调用。默认值: false
    • start <number> | <string> | <null> | <Array> | <Object> | <Function> 聚合函数的初始值。该值在聚合函数初始化时使用。当传入 <Function> 时,初始值将作为其返回值。
    • step <Function> 每行聚合时调用的函数。该函数接收当前状态和行的值。此函数的返回值应为新的状态。
    • result <Function> 用于获取聚合结果的函数。该函数接收最终状态,并应返回聚合的结果。
    • inverse <Function> 当提供此函数时,aggregate 方法将作为窗口函数运行。该函数接收当前状态和被丢弃的行的值。此函数的返回值应为新的状态。

当作为窗口函数使用时,result 函数会被调用多次。

【When used as a window function, the result function will be called multiple times.】

const { DatabaseSync } = require('node:sqlite');

const db = new DatabaseSync(':memory:');
db.exec(`
  CREATE TABLE t3(x, y);
  INSERT INTO t3 VALUES ('a', 4),
                        ('b', 5),
                        ('c', 3),
                        ('d', 8),
                        ('e', 1);
`);

db.aggregate('sumint', {
  start: 0,
  step: (acc, value) => acc + value,
});

db.prepare('SELECT sumint(y) as total FROM t3').get(); // { total: 21 }import { DatabaseSync } from 'node:sqlite';

const db = new DatabaseSync(':memory:');
db.exec(`
  CREATE TABLE t3(x, y);
  INSERT INTO t3 VALUES ('a', 4),
                        ('b', 5),
                        ('c', 3),
                        ('d', 8),
                        ('e', 1);
`);

db.aggregate('sumint', {
  start: 0,
  step: (acc, value) => acc + value,
});

db.prepare('SELECT sumint(y) as total FROM t3').get(); // { total: 21 }