kysely
    Preparing search index...

    Class AggregateFunctionBuilder<DB, TB, O>

    An expression with an as method.

    Type Parameters

    • DB
    • TB extends keyof DB
    • O = unknown

    Implements

    Index

    Constructors

    Methods

    • Adds a filter clause with a nested where clause after the function.

      Similar to WhereInterface's where method.

      Also see filterWhereRef.

      Count by gender:

      const result = await db
      .selectFrom('person')
      .select((eb) => [
      eb.fn
      .count<number>('id')
      .filterWhere('gender', '=', 'female')
      .as('female_count'),
      eb.fn
      .count<number>('id')
      .filterWhere('gender', '=', 'male')
      .as('male_count'),
      eb.fn
      .count<number>('id')
      .filterWhere('gender', '=', 'other')
      .as('other_count'),
      ])
      .executeTakeFirstOrThrow()

      The generated SQL (PostgreSQL):

      select
      count("id") filter(where "gender" = $1) as "female_count",
      count("id") filter(where "gender" = $2) as "male_count",
      count("id") filter(where "gender" = $3) as "other_count"
      from "person"

      Type Parameters

      • RE extends
            | string
            | Expression<any>
            | DynamicReferenceBuilder<any>
            | SelectQueryBuilderExpression<Record<string, any>>
            | OperandExpressionFactory<DB, TB, any>
      • VE extends any

      Parameters

      Returns AggregateFunctionBuilder<DB, TB, O>

    • Adds a filter clause with a nested where clause after the function.

      Similar to WhereInterface's where method.

      Also see filterWhereRef.

      Count by gender:

      const result = await db
      .selectFrom('person')
      .select((eb) => [
      eb.fn
      .count<number>('id')
      .filterWhere('gender', '=', 'female')
      .as('female_count'),
      eb.fn
      .count<number>('id')
      .filterWhere('gender', '=', 'male')
      .as('male_count'),
      eb.fn
      .count<number>('id')
      .filterWhere('gender', '=', 'other')
      .as('other_count'),
      ])
      .executeTakeFirstOrThrow()

      The generated SQL (PostgreSQL):

      select
      count("id") filter(where "gender" = $1) as "female_count",
      count("id") filter(where "gender" = $2) as "male_count",
      count("id") filter(where "gender" = $3) as "other_count"
      from "person"

      Type Parameters

      Parameters

      • expression: E

      Returns AggregateFunctionBuilder<DB, TB, O>

    • Adds a filter clause with a nested where clause after the function, where both sides of the operator are references to columns.

      Similar to WhereInterface's whereRef method.

      Count people with same first and last names versus general public:

      const result = await db
      .selectFrom('person')
      .select((eb) => [
      eb.fn
      .count<number>('id')
      .filterWhereRef('first_name', '=', 'last_name')
      .as('repeat_name_count'),
      eb.fn.count<number>('id').as('total_count'),
      ])
      .executeTakeFirstOrThrow()

      The generated SQL (PostgreSQL):

      select
      count("id") filter(where "first_name" = "last_name") as "repeat_name_count",
      count("id") as "total_count"
      from "person"

      Type Parameters

      • LRE extends
            | string
            | Expression<any>
            | DynamicReferenceBuilder<any>
            | SelectQueryBuilderExpression<Record<string, any>>
            | OperandExpressionFactory<DB, TB, any>
      • RRE extends
            | string
            | Expression<any>
            | DynamicReferenceBuilder<any>
            | SelectQueryBuilderExpression<Record<string, any>>
            | OperandExpressionFactory<DB, TB, any>

      Parameters

      Returns AggregateFunctionBuilder<DB, TB, O>

    • Adds an over clause (window functions) after the function.

      const result = await db
      .selectFrom('person')
      .select(
      (eb) => eb.fn.avg<number>('age').over().as('average_age')
      )
      .execute()

      The generated SQL (PostgreSQL):

      select avg("age") over() as "average_age"
      from "person"

      Also supports passing a callback that returns an over builder, allowing to add partition by and sort by clauses inside over.

      const result = await db
      .selectFrom('person')
      .select(
      (eb) => eb.fn.avg<number>('age').over(
      ob => ob.partitionBy('last_name').orderBy('first_name', 'asc')
      ).as('average_age')
      )
      .execute()

      The generated SQL (PostgreSQL):

      select avg("age") over(partition by "last_name" order by "first_name" asc) as "average_age"
      from "person"

      Parameters

      Returns AggregateFunctionBuilder<DB, TB, O>

    • Adds a withing group clause with a nested order by clause after the function.

      This is only supported by some dialects like PostgreSQL or MS SQL Server.

      Most frequent person name:

      const result = await db
      .selectFrom('person')
      .select((eb) => [
      eb.fn
      .agg<string>('mode')
      .withinGroupOrderBy('person.first_name')
      .as('most_frequent_name')
      ])
      .executeTakeFirstOrThrow()

      The generated SQL (PostgreSQL):

      select mode() within group (order by "person"."first_name") as "most_frequent_name"
      from "person"

      Type Parameters

      • OE extends
            | string
            | Expression<any>
            | DynamicReferenceBuilder<any>
            | SelectQueryBuilderExpression<Record<string, any>>
            | OperandExpressionFactory<DB, TB, any>

      Parameters

      Returns AggregateFunctionBuilder<DB, TB, O>

    • Type Parameters

      • OE extends
            | string
            | Expression<any>
            | DynamicReferenceBuilder<any>
            | SelectQueryBuilderExpression<Record<string, any>>
            | OperandExpressionFactory<DB, TB, any>

      Parameters

      • exprs: readonly OE[]

      Returns AggregateFunctionBuilder<DB, TB, O>

      It does ~2-2.6x more compile-time instantiations compared to multiple chained withinGroupOrderBy(expr, modifiers?) calls (in order by clauses with reasonable item counts), and has broken autocompletion.

    • Type Parameters

      • OE extends
            | `${string} desc`
            | `${string} asc`
            | `${string}.${string} desc`
            | `${string}.${string} asc`

      Parameters

      Returns AggregateFunctionBuilder<DB, TB, O>

      It does ~2.9x more compile-time instantiations compared to a withinGroupOrderBy(expr, direction) call.

    • Type Parameters

      • OE extends
            | string
            | Expression<any>
            | DynamicReferenceBuilder<any>
            | SelectQueryBuilderExpression<Record<string, any>>
            | OperandExpressionFactory<DB, TB, any>

      Parameters

      Returns AggregateFunctionBuilder<DB, TB, O>

      Use withinGroupOrderBy(expr, (ob) => ...) instead.