60 lines
2.1 KiB
Go
60 lines
2.1 KiB
Go
package jet
|
|
|
|
// MODE computes the most frequent value of the aggregated argument
|
|
func MODE() *OrderSetAggregateFunc {
|
|
return newOrderSetAggregateFunction("MODE", nil)
|
|
}
|
|
|
|
// PERCENTILE_CONT computes a value corresponding to the specified fraction within the ordered set of
|
|
// aggregated argument values. This will interpolate between adjacent input items if needed.
|
|
func PERCENTILE_CONT(fraction FloatExpression) *OrderSetAggregateFunc {
|
|
return newOrderSetAggregateFunction("PERCENTILE_CONT", fraction)
|
|
}
|
|
|
|
// PERCENTILE_DISC computes the first value within the ordered set of aggregated argument values whose position
|
|
// in the ordering equals or exceeds the specified fraction. The aggregated argument must be of a sortable type.
|
|
func PERCENTILE_DISC(fraction FloatExpression) *OrderSetAggregateFunc {
|
|
return newOrderSetAggregateFunction("PERCENTILE_DISC", fraction)
|
|
}
|
|
|
|
// OrderSetAggregateFunc implementation of order set aggregate function
|
|
type OrderSetAggregateFunc struct {
|
|
name string
|
|
fraction FloatExpression
|
|
orderBy Window
|
|
}
|
|
|
|
func newOrderSetAggregateFunction(name string, fraction FloatExpression) *OrderSetAggregateFunc {
|
|
return &OrderSetAggregateFunc{
|
|
name: name,
|
|
fraction: fraction,
|
|
}
|
|
}
|
|
|
|
// WITHIN_GROUP_ORDER_BY specifies ordered set of aggregated argument values
|
|
func (p *OrderSetAggregateFunc) WITHIN_GROUP_ORDER_BY(orderBy OrderByClause) Expression {
|
|
p.orderBy = ORDER_BY(orderBy)
|
|
return newOrderSetAggregateFuncExpression(p)
|
|
}
|
|
|
|
func newOrderSetAggregateFuncExpression(aggFunc *OrderSetAggregateFunc) Expression {
|
|
return newExpression(&orderSetAggregateFuncSerializer{
|
|
OrderSetAggregateFunc: aggFunc,
|
|
})
|
|
}
|
|
|
|
type orderSetAggregateFuncSerializer struct {
|
|
*OrderSetAggregateFunc
|
|
}
|
|
|
|
func (p *orderSetAggregateFuncSerializer) serialize(statement StatementType, out *SQLBuilder, options ...SerializeOption) {
|
|
out.WriteString(p.name)
|
|
|
|
if p.fraction != nil {
|
|
wrap(p.fraction).serialize(statement, out, FallTrough(options)...)
|
|
} else {
|
|
wrap().serialize(statement, out, FallTrough(options)...)
|
|
}
|
|
out.WriteString("WITHIN GROUP")
|
|
p.orderBy.serialize(statement, out)
|
|
}
|