mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-21 15:12:02 +00:00
Some fixes to quantile*() functions related to DateTime argument type
This commit is contained in:
parent
5f3dcf794a
commit
fc272ecded
@ -4,9 +4,6 @@
|
||||
|
||||
#include <AggregateFunctions/AggregateFunctionQuantile.h>
|
||||
|
||||
#include <DataTypes/DataTypeDate.h>
|
||||
#include <DataTypes/DataTypeDateTime.h>
|
||||
|
||||
|
||||
namespace DB
|
||||
{
|
||||
@ -52,10 +49,10 @@ static constexpr bool SupportDecimal()
|
||||
}
|
||||
|
||||
|
||||
template <template <typename> class Function, bool have_second_arg>
|
||||
template <template <typename> class Function>
|
||||
AggregateFunctionPtr createAggregateFunctionQuantile(const std::string & name, const DataTypes & argument_types, const Array & params)
|
||||
{
|
||||
if constexpr (have_second_arg)
|
||||
if constexpr (Function<void>::hasSecondArg()) // FIXME: a little bit hacky to specify concrete type to call a static method.
|
||||
assertBinary(name, argument_types);
|
||||
else
|
||||
assertUnary(name, argument_types);
|
||||
@ -86,29 +83,29 @@ AggregateFunctionPtr createAggregateFunctionQuantile(const std::string & name, c
|
||||
|
||||
void registerAggregateFunctionsQuantile(AggregateFunctionFactory & factory)
|
||||
{
|
||||
factory.registerFunction(NameQuantile::name, createAggregateFunctionQuantile<FuncQuantile, false>);
|
||||
factory.registerFunction(NameQuantiles::name, createAggregateFunctionQuantile<FuncQuantiles, false>);
|
||||
factory.registerFunction(NameQuantile::name, createAggregateFunctionQuantile<FuncQuantile>);
|
||||
factory.registerFunction(NameQuantiles::name, createAggregateFunctionQuantile<FuncQuantiles>);
|
||||
|
||||
factory.registerFunction(NameQuantileDeterministic::name, createAggregateFunctionQuantile<FuncQuantileDeterministic, true>);
|
||||
factory.registerFunction(NameQuantilesDeterministic::name, createAggregateFunctionQuantile<FuncQuantilesDeterministic, true>);
|
||||
factory.registerFunction(NameQuantileDeterministic::name, createAggregateFunctionQuantile<FuncQuantileDeterministic>);
|
||||
factory.registerFunction(NameQuantilesDeterministic::name, createAggregateFunctionQuantile<FuncQuantilesDeterministic>);
|
||||
|
||||
factory.registerFunction(NameQuantileExact::name, createAggregateFunctionQuantile<FuncQuantileExact, false>);
|
||||
factory.registerFunction(NameQuantilesExact::name, createAggregateFunctionQuantile<FuncQuantilesExact, false>);
|
||||
factory.registerFunction(NameQuantileExact::name, createAggregateFunctionQuantile<FuncQuantileExact>);
|
||||
factory.registerFunction(NameQuantilesExact::name, createAggregateFunctionQuantile<FuncQuantilesExact>);
|
||||
|
||||
factory.registerFunction(NameQuantileExactWeighted::name, createAggregateFunctionQuantile<FuncQuantileExactWeighted, true>);
|
||||
factory.registerFunction(NameQuantilesExactWeighted::name, createAggregateFunctionQuantile<FuncQuantilesExactWeighted, true>);
|
||||
factory.registerFunction(NameQuantileExactWeighted::name, createAggregateFunctionQuantile<FuncQuantileExactWeighted>);
|
||||
factory.registerFunction(NameQuantilesExactWeighted::name, createAggregateFunctionQuantile<FuncQuantilesExactWeighted>);
|
||||
|
||||
factory.registerFunction(NameQuantileTiming::name, createAggregateFunctionQuantile<FuncQuantileTiming, false>);
|
||||
factory.registerFunction(NameQuantilesTiming::name, createAggregateFunctionQuantile<FuncQuantilesTiming, false>);
|
||||
factory.registerFunction(NameQuantileTiming::name, createAggregateFunctionQuantile<FuncQuantileTiming>);
|
||||
factory.registerFunction(NameQuantilesTiming::name, createAggregateFunctionQuantile<FuncQuantilesTiming>);
|
||||
|
||||
factory.registerFunction(NameQuantileTimingWeighted::name, createAggregateFunctionQuantile<FuncQuantileTimingWeighted, true>);
|
||||
factory.registerFunction(NameQuantilesTimingWeighted::name, createAggregateFunctionQuantile<FuncQuantilesTimingWeighted, true>);
|
||||
factory.registerFunction(NameQuantileTimingWeighted::name, createAggregateFunctionQuantile<FuncQuantileTimingWeighted>);
|
||||
factory.registerFunction(NameQuantilesTimingWeighted::name, createAggregateFunctionQuantile<FuncQuantilesTimingWeighted>);
|
||||
|
||||
factory.registerFunction(NameQuantileTDigest::name, createAggregateFunctionQuantile<FuncQuantileTDigest, false>);
|
||||
factory.registerFunction(NameQuantilesTDigest::name, createAggregateFunctionQuantile<FuncQuantilesTDigest, false>);
|
||||
factory.registerFunction(NameQuantileTDigest::name, createAggregateFunctionQuantile<FuncQuantileTDigest>);
|
||||
factory.registerFunction(NameQuantilesTDigest::name, createAggregateFunctionQuantile<FuncQuantilesTDigest>);
|
||||
|
||||
factory.registerFunction(NameQuantileTDigestWeighted::name, createAggregateFunctionQuantile<FuncQuantileTDigestWeighted, true>);
|
||||
factory.registerFunction(NameQuantilesTDigestWeighted::name, createAggregateFunctionQuantile<FuncQuantilesTDigestWeighted, true>);
|
||||
factory.registerFunction(NameQuantileTDigestWeighted::name, createAggregateFunctionQuantile<FuncQuantileTDigestWeighted>);
|
||||
factory.registerFunction(NameQuantilesTDigestWeighted::name, createAggregateFunctionQuantile<FuncQuantilesTDigestWeighted>);
|
||||
|
||||
/// 'median' is an alias for 'quantile'
|
||||
factory.registerAlias("median", NameQuantile::name);
|
||||
|
@ -1,19 +1,26 @@
|
||||
#pragma once
|
||||
|
||||
#include <type_traits>
|
||||
|
||||
#include <IO/WriteHelpers.h>
|
||||
#include <IO/ReadHelpers.h>
|
||||
|
||||
#include <DataTypes/DataTypesNumber.h>
|
||||
#include <DataTypes/DataTypeArray.h>
|
||||
/// These must be exposed in header for the purpose of dynamic compilation.
|
||||
#include <AggregateFunctions/QuantileReservoirSampler.h>
|
||||
#include <AggregateFunctions/QuantileReservoirSamplerDeterministic.h>
|
||||
#include <AggregateFunctions/QuantileExact.h>
|
||||
#include <AggregateFunctions/QuantileExactWeighted.h>
|
||||
#include <AggregateFunctions/QuantileTiming.h>
|
||||
#include <AggregateFunctions/QuantileTDigest.h>
|
||||
|
||||
#include <AggregateFunctions/IAggregateFunction.h>
|
||||
#include <AggregateFunctions/QuantilesCommon.h>
|
||||
|
||||
#include <Columns/ColumnArray.h>
|
||||
#include <Columns/ColumnsNumber.h>
|
||||
#include <Columns/ColumnDecimal.h>
|
||||
#include <Columns/ColumnsNumber.h>
|
||||
#include <DataTypes/DataTypeArray.h>
|
||||
#include <DataTypes/DataTypeDate.h>
|
||||
#include <DataTypes/DataTypeDateTime.h>
|
||||
#include <DataTypes/DataTypesNumber.h>
|
||||
#include <IO/ReadHelpers.h>
|
||||
#include <IO/WriteHelpers.h>
|
||||
|
||||
#include <type_traits>
|
||||
|
||||
|
||||
namespace DB
|
||||
@ -36,10 +43,10 @@ template <
|
||||
typename Data,
|
||||
/// Structure with static member "name", containing the name of the aggregate function.
|
||||
typename Name,
|
||||
/// If true, the function accept second argument
|
||||
/// If true, the function accepts the second argument
|
||||
/// (in can be "weight" to calculate quantiles or "determinator" that is used instead of PRNG).
|
||||
/// Second argument is always obtained through 'getUInt' method.
|
||||
bool have_second_arg,
|
||||
bool has_second_arg,
|
||||
/// If non-void, the function will return float of specified type with possibly interpolated results and NaN if there was no values.
|
||||
/// Otherwise it will return Value type and default value if there was no values.
|
||||
/// As an example, the function cannot return floats, if the SQL type of argument is Date or DateTime.
|
||||
@ -49,12 +56,14 @@ template <
|
||||
bool returns_many
|
||||
>
|
||||
class AggregateFunctionQuantile final : public IAggregateFunctionDataHelper<Data,
|
||||
AggregateFunctionQuantile<Value, Data, Name, have_second_arg, FloatReturnType, returns_many>>
|
||||
AggregateFunctionQuantile<Value, Data, Name, has_second_arg, FloatReturnType, returns_many>>
|
||||
{
|
||||
private:
|
||||
using ColVecType = std::conditional_t<IsDecimalNumber<Value>, ColumnDecimal<Value>, ColumnVector<Value>>;
|
||||
|
||||
static constexpr bool returns_float = !std::is_same_v<FloatReturnType, void>;
|
||||
static constexpr bool returns_float = !(std::is_same_v<FloatReturnType, void>)&&(
|
||||
!(std::is_same_v<Value, DataTypeDate::FieldType> || std::is_same_v<Value, DataTypeDateTime::FieldType>)
|
||||
|| std::is_same_v<Data, QuantileTiming<Value>>);
|
||||
static_assert(!IsDecimalNumber<Value> || !returns_float);
|
||||
|
||||
QuantileLevels<Float64> levels;
|
||||
@ -92,7 +101,7 @@ public:
|
||||
void add(AggregateDataPtr place, const IColumn ** columns, size_t row_num, Arena *) const override
|
||||
{
|
||||
const auto & column = static_cast<const ColVecType &>(*columns[0]);
|
||||
if constexpr (have_second_arg)
|
||||
if constexpr (has_second_arg)
|
||||
this->data(place).add(
|
||||
column.getData()[row_num],
|
||||
columns[1]->getUInt(row_num));
|
||||
@ -159,22 +168,10 @@ public:
|
||||
}
|
||||
|
||||
const char * getHeaderFilePath() const override { return __FILE__; }
|
||||
|
||||
static constexpr bool hasSecondArg() { return has_second_arg; }
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
|
||||
/// These must be exposed in header for the purpose of dynamic compilation.
|
||||
#include <AggregateFunctions/QuantileReservoirSampler.h>
|
||||
#include <AggregateFunctions/QuantileReservoirSamplerDeterministic.h>
|
||||
#include <AggregateFunctions/QuantileExact.h>
|
||||
#include <AggregateFunctions/QuantileExactWeighted.h>
|
||||
#include <AggregateFunctions/QuantileTiming.h>
|
||||
#include <AggregateFunctions/QuantileTDigest.h>
|
||||
|
||||
namespace DB
|
||||
{
|
||||
|
||||
struct NameQuantile { static constexpr auto name = "quantile"; };
|
||||
struct NameQuantiles { static constexpr auto name = "quantiles"; };
|
||||
struct NameQuantileDeterministic { static constexpr auto name = "quantileDeterministic"; };
|
||||
|
@ -0,0 +1,16 @@
|
||||
2016-06-15 23:00:00
|
||||
['2016-06-15 23:00:00']
|
||||
2016-06-15 23:00:00
|
||||
['2016-06-15 23:00:00']
|
||||
2016-06-15 23:00:00
|
||||
['2016-06-15 23:00:00']
|
||||
2016-06-15 23:00:00
|
||||
['2016-06-15 23:00:00']
|
||||
30000
|
||||
[30000]
|
||||
30000
|
||||
[30000]
|
||||
2016-06-15 23:01:04
|
||||
['2016-06-15 23:01:04']
|
||||
2016-06-15 23:01:04
|
||||
['2016-06-15 23:01:04']
|
26
dbms/tests/queries/0_stateless/00753_quantile_format.sql
Normal file
26
dbms/tests/queries/0_stateless/00753_quantile_format.sql
Normal file
@ -0,0 +1,26 @@
|
||||
CREATE TABLE test.datetime (d DateTime) ENGINE = Memory;
|
||||
INSERT INTO test.datetime(d) VALUES(toDateTime('2016-06-15 23:00:00'));
|
||||
|
||||
SELECT quantile(0.2)(d) FROM test.datetime;
|
||||
SELECT quantiles(0.2)(d) FROM test.datetime;
|
||||
|
||||
SELECT quantileDeterministic(0.2)(d, 1) FROM test.datetime;
|
||||
SELECT quantilesDeterministic(0.2)(d, 1) FROM test.datetime;
|
||||
|
||||
SELECT quantileExact(0.2)(d) FROM test.datetime;
|
||||
SELECT quantilesExact(0.2)(d) FROM test.datetime;
|
||||
|
||||
SELECT quantileExactWeighted(0.2)(d, 1) FROM test.datetime;
|
||||
SELECT quantilesExactWeighted(0.2)(d, 1) FROM test.datetime;
|
||||
|
||||
SELECT quantileTiming(0.2)(d) FROM test.datetime;
|
||||
SELECT quantilesTiming(0.2)(d) FROM test.datetime;
|
||||
|
||||
SELECT quantileTimingWeighted(0.2)(d, 1) FROM test.datetime;
|
||||
SELECT quantilesTimingWeighted(0.2)(d, 1) FROM test.datetime;
|
||||
|
||||
SELECT quantileTDigest(0.2)(d) FROM test.datetime;
|
||||
SELECT quantilesTDigest(0.2)(d) FROM test.datetime;
|
||||
|
||||
SELECT quantileTDigestWeighted(0.2)(d, 1) FROM test.datetime;
|
||||
SELECT quantilesTDigestWeighted(0.2)(d, 1) FROM test.datetime;
|
Loading…
Reference in New Issue
Block a user