Changeset: 1ceddbfc2c74 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=1ceddbfc2c74
Modified Files:
        gdk/ChangeLog
        gdk/gdk_aggr.c
        sql/test/quantiles/Tests/quantiles.stable.out
Branch: default
Log Message:

Round quantile position down to nearest integer.
I.e., 1.5 is rounded down to 1, 1.51 is rounded to 2 (nearer than 1).


diffs (169 lines):

diff --git a/gdk/ChangeLog b/gdk/ChangeLog
--- a/gdk/ChangeLog
+++ b/gdk/ChangeLog
@@ -1,6 +1,12 @@
 # ChangeLog file for MonetDB
 # This file is updated with Maddlog
 
+* Fri Feb 17 2017 Sjoerd Mullender <[email protected]>
+- Quantiles calculate a position in the sorted column.  If this position
+  is not an integer, we now choose the nearest position, favoring the
+  lower if the distance to the two adjacent positions is equal (round
+  down to nearest integer).
+
 * Mon Jan 30 2017 Sjoerd Mullender <[email protected]>
 - Removed function BATprintf.  Use BATprint or BATprintcolumns instead.
 - Removed BATsave from the list of exported functions.
diff --git a/gdk/gdk_aggr.c b/gdk/gdk_aggr.c
--- a/gdk/gdk_aggr.c
+++ b/gdk/gdk_aggr.c
@@ -2490,7 +2490,8 @@ BATgroupquantile(BAT *b, BAT *g, BAT *e,
                                        v = nil;
                                        nils++;
                                } else {
-                                       qindex = (BUN) (r + (p-r-1) * quantile);
+                                       /* round *down* to nearest integer */
+                                       qindex = r + p - (BUN) (p + 0.5 - (p - 
r - 1) * quantile);
                                        /* be a little paranoid about the index 
*/
                                        assert(qindex >= r);
                                        assert(qindex <  p);
@@ -2516,7 +2517,7 @@ BATgroupquantile(BAT *b, BAT *g, BAT *e,
                        while (r < p && (*atomcmp)(BUNtail(bi, r), nil) == 0)
                                r++;
                }
-               index = (BUN) (r + (p-r-1) * quantile);
+               index = r + p - (BUN) (p + 0.5 - (p - r - 1) * quantile);
                v = BUNtail(bi, index);
                if (BUNappend(bn, v, FALSE) != GDK_SUCCEED)
                        goto bunins_failed;
diff --git a/sql/test/quantiles/Tests/quantiles.stable.out 
b/sql/test/quantiles/Tests/quantiles.stable.out
--- a/sql/test/quantiles/Tests/quantiles.stable.out
+++ b/sql/test/quantiles/Tests/quantiles.stable.out
@@ -94,98 +94,98 @@ Ready.
 #7532.30       "A"
 [ 10000        ]
 #select quantile(l_extendedprice,0.5) from lit;
-% sys.L1 # table_name
-% L1 # name
+% sys.L4 # table_name
+% L3 # name
 % decimal # type
 % 20 # length
 [ 36724.500    ]
 #select median(l_extendedprice) from lit;
-% sys.L1 # table_name
-% L1 # name
+% sys.L4 # table_name
+% L3 # name
 % decimal # type
 % 20 # length
 [ 36724.50     ]
 #select quantile(l_extendedprice,0.0) from lit;
-% sys.L1 # table_name
-% L1 # name
+% sys.L4 # table_name
+% L3 # name
 % decimal # type
 % 20 # length
 [ 947.020      ]
 #select quantile(l_extendedprice,1.0) from lit;
-% sys.L1 # table_name
-% L1 # name
+% sys.L4 # table_name
+% L3 # name
 % decimal # type
 % 20 # length
 [ 103149.000   ]
 #select 
quantile(l_extendedprice,0.05),quantile(l_extendedprice,0.5),quantile(l_extendedprice,0.95)
 from lit;
-% sys.L1,      sys.L2, sys.L3 # table_name
-% L1,  L2,     L3 # name
+% sys.L4,      sys.L7, sys.L12 # table_name
+% L3,  L6,     L11 # name
 % decimal,     decimal,        decimal # type
 % 20,  20,     20 # length
-[ 4171.320,    36724.500,      79584.120       ]
+[ 4200.320,    36724.500,      79584.120       ]
 #select quantile(l_extendedprice,1) from lit;
-% sys.L1 # table_name
-% L1 # name
+% sys.L4 # table_name
+% L3 # name
 % decimal # type
 % 20 # length
 [ 103149.000   ]
 #select quantile(l_extendedprice,0) from lit;
-% sys.L1 # table_name
-% L1 # name
+% sys.L4 # table_name
+% L3 # name
 % decimal # type
 % 20 # length
 [ 947.020      ]
 #select quantile(l_extendedprice,0.5) from lit group by l_returnflag;
-% sys.L1 # table_name
-% L1 # name
+% sys.L3 # table_name
+% L2 # name
 % decimal # type
 % 20 # length
 [ 36960.680    ]
 [ 37144.200    ]
 [ 35937.880    ]
 #select median(l_extendedprice) from lit group by l_returnflag;
-% sys.L1 # table_name
-% L1 # name
+% sys.L3 # table_name
+% L2 # name
 % decimal # type
 % 20 # length
 [ 36960.68     ]
 [ 37144.20     ]
 [ 35937.88     ]
 #select quantile(l_extendedprice,0.0) from lit group by l_returnflag;
-% sys.L1 # table_name
-% L1 # name
+% sys.L3 # table_name
+% L2 # name
 % decimal # type
 % 20 # length
 [ 947.020      ]
 [ 1027.010     ]
 [ 1012.090     ]
 #select quantile(l_extendedprice,1.0) from lit group by l_returnflag;
-% sys.L1 # table_name
-% L1 # name
+% sys.L3 # table_name
+% L2 # name
 % decimal # type
 % 20 # length
 [ 103149.000   ]
 [ 100248.500   ]
 [ 101896.500   ]
 #select 
quantile(l_extendedprice,0.05),quantile(l_extendedprice,0.5),quantile(l_extendedprice,0.95)
 from lit  group by l_returnflag;
-% sys.L1,      sys.L2, sys.L3 # table_name
-% L1,  L2,     L3 # name
+% sys.L3,      sys.L6, sys.L11 # table_name
+% L2,  L5,     L10 # name
 % decimal,     decimal,        decimal # type
 % 20,  20,     20 # length
 [ 4424.440,    36960.680,      80045.910       ]
 [ 3885.880,    37144.200,      79010.100       ]
 [ 4171.320,    35937.880,      78572.760       ]
 #select quantile(l_extendedprice,1) from lit group by l_returnflag;
-% sys.L1 # table_name
-% L1 # name
+% sys.L3 # table_name
+% L2 # name
 % decimal # type
 % 20 # length
 [ 103149.000   ]
 [ 100248.500   ]
 [ 101896.500   ]
 #select quantile(l_extendedprice,0) from lit group by l_returnflag;
-% sys.L1 # table_name
-% L1 # name
+% sys.L3 # table_name
+% L2 # name
 % decimal # type
 % 20 # length
 [ 947.020      ]
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to