mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-23 08:02:02 +00:00
dbms: aggregate function quantileTiming: added (deterministic) randomization [#CONV-2944].
This commit is contained in:
parent
6c1b8aadd0
commit
9a4d300a10
@ -12,6 +12,8 @@
|
|||||||
|
|
||||||
#include <DB/Columns/ColumnArray.h>
|
#include <DB/Columns/ColumnArray.h>
|
||||||
|
|
||||||
|
#include <stats/IntHash.h>
|
||||||
|
|
||||||
|
|
||||||
namespace DB
|
namespace DB
|
||||||
{
|
{
|
||||||
@ -136,6 +138,13 @@ namespace detail
|
|||||||
/// Число значений для каждого значения от small_threshold до big_threshold, округлённого до big_precision.
|
/// Число значений для каждого значения от small_threshold до big_threshold, округлённого до big_precision.
|
||||||
UInt64 count_big[BIG_SIZE];
|
UInt64 count_big[BIG_SIZE];
|
||||||
|
|
||||||
|
/// Получить значение квантиля по индексу в массиве count_big.
|
||||||
|
static inline UInt16 indexInBigToValue(size_t i)
|
||||||
|
{
|
||||||
|
return (i * BIG_PRECISION) + SMALL_THRESHOLD
|
||||||
|
+ (intHash32<0>(i) % BIG_PRECISION - (BIG_PRECISION / 2)); /// Небольшая рандомизация, чтобы не было заметно, что все значения чётные.
|
||||||
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
QuantileTimingLarge()
|
QuantileTimingLarge()
|
||||||
{
|
{
|
||||||
@ -209,7 +218,7 @@ namespace detail
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (i < BIG_SIZE)
|
if (i < BIG_SIZE)
|
||||||
return (i * BIG_PRECISION) + SMALL_THRESHOLD;
|
return indexInBigToValue(i);
|
||||||
|
|
||||||
return BIG_THRESHOLD;
|
return BIG_THRESHOLD;
|
||||||
}
|
}
|
||||||
@ -258,7 +267,7 @@ namespace detail
|
|||||||
|
|
||||||
if (i < BIG_SIZE)
|
if (i < BIG_SIZE)
|
||||||
{
|
{
|
||||||
*result = (i * BIG_PRECISION) + SMALL_THRESHOLD;
|
*result = indexInBigToValue(i);
|
||||||
|
|
||||||
++level;
|
++level;
|
||||||
++result;
|
++result;
|
||||||
|
Loading…
Reference in New Issue
Block a user