diff --git a/jOOQ/src/main/java/org/jooq/impl/DSL.java b/jOOQ/src/main/java/org/jooq/impl/DSL.java index 9ee62ab0b4..71ecfef5f5 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DSL.java +++ b/jOOQ/src/main/java/org/jooq/impl/DSL.java @@ -10117,9 +10117,9 @@ public class DSL { /** * Get the median over a numeric field: median(field). */ - @Support({ CUBRID, HSQLDB }) + @Support({ CUBRID, HSQLDB, POSTGRES_9_4 }) public static AggregateFunction median(Field field) { - return new Function("median", SQLDataType.NUMERIC, nullSafe(field)); + return new Function(Term.MEDIAN, SQLDataType.NUMERIC, nullSafe(field)); } /** @@ -10653,8 +10653,8 @@ public class DSL { * function. */ @Support({ POSTGRES_9_4 }) - public static OrderedAggregateFunction percentile_cont(double number) { - return new Function("percentile_cont", SQLDataType.DOUBLE, val(number)); + public static OrderedAggregateFunction percentileCont(Number number) { + return percentileCont(val(number)); } /** @@ -10663,8 +10663,8 @@ public class DSL { * function. */ @Support({ POSTGRES_9_4 }) - public static OrderedAggregateFunction percentile_cont(BigDecimal number) { - return new Function("percentile_cont", SQLDataType.NUMERIC, val(number, BigDecimal.class)); + public static OrderedAggregateFunction percentileCont(Field field) { + return new Function("percentile_cont", SQLDataType.NUMERIC, nullSafe(field)); } /** @@ -10673,8 +10673,8 @@ public class DSL { * function. */ @Support({ POSTGRES_9_4 }) - public static OrderedAggregateFunction percentile_disc(Double number) { - return new Function("percentile_disc", SQLDataType.DOUBLE, val(number, Double.class)); + public static OrderedAggregateFunction percentileDisc(Number number) { + return percentileDisc(val(number)); } /** @@ -10683,8 +10683,8 @@ public class DSL { * function. */ @Support({ POSTGRES_9_4 }) - public static OrderedAggregateFunction percentile_disc(BigDecimal number) { - return new Function("percentile_disc", SQLDataType.NUMERIC, val(number, BigDecimal.class)); + public static OrderedAggregateFunction percentileDisc(Field field) { + return new Function("percentile_disc", SQLDataType.NUMERIC, nullSafe(field)); } /** diff --git a/jOOQ/src/main/java/org/jooq/impl/Function.java b/jOOQ/src/main/java/org/jooq/impl/Function.java index 548c49eea2..610a96547a 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Function.java +++ b/jOOQ/src/main/java/org/jooq/impl/Function.java @@ -54,11 +54,14 @@ import static org.jooq.SQLDialect.POSTGRES_9_4; import static org.jooq.impl.DSL.condition; import static org.jooq.impl.DSL.name; import static org.jooq.impl.DSL.one; +import static org.jooq.impl.DSL.percentileCont; import static org.jooq.impl.Term.LIST_AGG; +import static org.jooq.impl.Term.MEDIAN; import static org.jooq.impl.Term.ROW_NUMBER; import static org.jooq.impl.Utils.DATA_LOCALLY_SCOPED_DATA_MAP; import static org.jooq.impl.Utils.DATA_WINDOW_DEFINITIONS; +import java.math.BigDecimal; import java.util.Arrays; import java.util.Collection; import java.util.Map; @@ -202,6 +205,13 @@ class Function extends AbstractField implements xxxxxxxxxxxxxxxxx x xx [/pro] */ + else if (term == MEDIAN && asList(POSTGRES).contains(ctx.family())) { + Field[] fields = new Field[arguments.size()]; + for (int i = 0; i < fields.length; i++) + fields[i] = DSL.field("{0}", arguments.get(i)); + + ctx.visit(percentileCont(new BigDecimal("0.5")).withinGroupOrderBy(fields)); + } else { toSQLArguments(ctx); toSQLKeepDenseRankOrderByClause(ctx); diff --git a/jOOQ/src/main/java/org/jooq/impl/Term.java b/jOOQ/src/main/java/org/jooq/impl/Term.java index cf5dac8a0e..9c530ca349 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Term.java +++ b/jOOQ/src/main/java/org/jooq/impl/Term.java @@ -146,6 +146,12 @@ enum Term { return "listagg"; } }, + MEDIAN { + @Override + public String translate(SQLDialect dialect) { + return "median"; + } + }, OCTET_LENGTH { @Override public String translate(SQLDialect dialect) {