@@ -11,7 +11,7 @@ import {
11
11
} from '../expression/expression.js'
12
12
import {
13
13
ReferenceExpression ,
14
- StringReference ,
14
+ SimpleReferenceExpression ,
15
15
} from '../parser/reference-parser.js'
16
16
import {
17
17
ComparisonOperatorExpression ,
@@ -21,7 +21,6 @@ import {
21
21
} from '../parser/binary-operation-parser.js'
22
22
import { SqlBool } from '../util/type-utils.js'
23
23
import { ExpressionOrFactory } from '../parser/expression-parser.js'
24
- import { DynamicReferenceBuilder } from '../dynamic/dynamic-reference-builder.js'
25
24
import {
26
25
OrderByDirectionExpression ,
27
26
parseOrderBy ,
@@ -125,7 +124,7 @@ export class AggregateFunctionBuilder<DB, TB extends keyof DB, O = unknown>
125
124
* inner join "pet" ON "pet"."owner_id" = "person"."id"
126
125
* ```
127
126
*/
128
- orderBy < OE extends StringReference < DB , TB > | DynamicReferenceBuilder < any > > (
127
+ orderBy < OE extends SimpleReferenceExpression < DB , TB > > (
129
128
orderBy : OE ,
130
129
direction ?: OrderByDirectionExpression ,
131
130
) : AggregateFunctionBuilder < DB , TB , O > {
@@ -138,6 +137,48 @@ export class AggregateFunctionBuilder<DB, TB extends keyof DB, O = unknown>
138
137
} )
139
138
}
140
139
140
+ /**
141
+ * Adds a `withing group` clause with a nested `order by` clause after the function.
142
+ *
143
+ * This is only supported by some dialects like PostgreSQL or MS SQL Server.
144
+ *
145
+ * ### Examples
146
+ *
147
+ * Most frequent person name:
148
+ *
149
+ * ```ts
150
+ * const result = await db
151
+ * .selectFrom('person')
152
+ * .select((eb) => [
153
+ * eb.fn
154
+ * .agg<string>('mode')
155
+ * .withinGroupOrderBy('person.first_name')
156
+ * .as('most_frequent_name')
157
+ * ])
158
+ * .executeTakeFirstOrThrow()
159
+ * ```
160
+ *
161
+ * The generated SQL (PostgreSQL):
162
+ *
163
+ * ```sql
164
+ * select mode() within group (order by "person"."first_name") as "most_frequent_name"
165
+ * from "person"
166
+ * ```
167
+ */
168
+ withinGroupOrderBy < OE extends SimpleReferenceExpression < DB , TB > > (
169
+ orderBy : OE ,
170
+ direction ?: OrderByDirectionExpression ,
171
+ ) : AggregateFunctionBuilder < DB , TB , O > {
172
+ return new AggregateFunctionBuilder ( {
173
+ ...this . #props,
174
+ aggregateFunctionNode : AggregateFunctionNode . cloneWithOrderBy (
175
+ this . #props. aggregateFunctionNode ,
176
+ parseOrderBy ( [ orderBy , direction ] ) ,
177
+ true ,
178
+ ) ,
179
+ } )
180
+ }
181
+
141
182
/**
142
183
* Adds a `filter` clause with a nested `where` clause after the function.
143
184
*
0 commit comments