Add support of PostgreSQL-style MODE()

上级 448567f1
...@@ -3417,8 +3417,8 @@ MEDIAN(X) ...@@ -3417,8 +3417,8 @@ MEDIAN(X)
" "
"Functions (Aggregate)","MODE"," "Functions (Aggregate)","MODE","
MODE( value ) { MODE( value ) [ ORDER BY expression [ ASC | DESC ] ] }
[ ORDER BY { expression [ ASC | DESC ] } ] | { MODE() WITHIN GROUP(ORDER BY expression [ ASC | DESC ]) }
[ FILTER ( WHERE expression ) ] [ FILTER ( WHERE expression ) ]
"," ","
Returns the value that occurs with the greatest frequency. Returns the value that occurs with the greatest frequency.
...@@ -3434,6 +3434,7 @@ Aggregates are only allowed in select statements. ...@@ -3434,6 +3434,7 @@ Aggregates are only allowed in select statements.
"," ","
MODE(X) MODE(X)
MODE(X ORDER BY X) MODE(X ORDER BY X)
MODE() WITHIN GROUP(ORDER BY X)
" "
"Functions (Numeric)","ABS"," "Functions (Numeric)","ABS","
......
...@@ -2968,6 +2968,16 @@ public class Parser { ...@@ -2968,6 +2968,16 @@ public class Parser {
break; break;
} }
case MODE: { case MODE: {
if (readIf(CLOSE_PAREN)) {
read("WITHIN");
read(GROUP);
read(OPEN_PAREN);
read(ORDER);
read("BY");
Expression expr = readExpression();
r = new Aggregate(AggregateType.MODE, expr, currentSelect, false);
setModeAggOrder(r, expr);
} else {
Expression expr = readExpression(); Expression expr = readExpression();
r = new Aggregate(aggregateType, expr, currentSelect, false); r = new Aggregate(aggregateType, expr, currentSelect, false);
if (readIf(ORDER)) { if (readIf(ORDER)) {
...@@ -2982,12 +2992,8 @@ public class Parser { ...@@ -2982,12 +2992,8 @@ public class Parser {
} }
throw getSyntaxError(); throw getSyntaxError();
} }
ArrayList<SelectOrderBy> orderList = new ArrayList<>(1); setModeAggOrder(r, expr);
SelectOrderBy order = new SelectOrderBy(); }
order.expression = expr;
order.sortType = parseSimpleSortType();
orderList.add(order);
r.setOrderByList(orderList);
} }
break; break;
} }
...@@ -3003,6 +3009,15 @@ public class Parser { ...@@ -3003,6 +3009,15 @@ public class Parser {
return r; return r;
} }
private void setModeAggOrder(Aggregate r, Expression expr) {
ArrayList<SelectOrderBy> orderList = new ArrayList<>(1);
SelectOrderBy order = new SelectOrderBy();
order.expression = expr;
order.sortType = parseSimpleSortType();
orderList.add(order);
r.setOrderByList(orderList);
}
private ArrayList<SelectOrderBy> parseSimpleOrderList() { private ArrayList<SelectOrderBy> parseSimpleOrderList() {
ArrayList<SelectOrderBy> orderList = Utils.newSmallArrayList(); ArrayList<SelectOrderBy> orderList = Utils.newSmallArrayList();
do { do {
......
...@@ -42,5 +42,14 @@ SELECT MODE(V ORDER BY V DESC) FROM TEST; ...@@ -42,5 +42,14 @@ SELECT MODE(V ORDER BY V DESC) FROM TEST;
SELECT MODE(V ORDER BY V + 1) FROM TEST; SELECT MODE(V ORDER BY V + 1) FROM TEST;
> exception SYNTAX_ERROR_2 > exception SYNTAX_ERROR_2
SELECT MODE() WITHIN GROUP(ORDER BY V) FROM TEST;
>> 1
SELECT MODE() WITHIN GROUP(ORDER BY V ASC) FROM TEST;
>> 1
SELECT MODE() WITHIN GROUP(ORDER BY V DESC) FROM TEST;
>> 3
DROP TABLE TEST; DROP TABLE TEST;
> ok > ok
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论