This is an automated email from the ASF dual-hosted git repository.

yiguolei pushed a commit to branch branch-2.1
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-2.1 by this push:
     new bf3d4240be4 [fix](window_func) fix bug of agg function used in window 
function and add many test cases (#40678) (#41328)
bf3d4240be4 is described below

commit bf3d4240be47e33532b602270a183e0e76f4ca6a
Author: TengJianPing <[email protected]>
AuthorDate: Thu Sep 26 22:50:34 2024 +0800

    [fix](window_func) fix bug of agg function used in window function and add 
many test cases (#40678) (#41328)
    
    ## Proposed changes
    
    Issue Number: close #xxx
    
    BP #40678
---
 be/src/pipeline/exec/analytic_source_operator.cpp  |   1 +
 .../vec/aggregate_functions/aggregate_function.h   |   3 -
 .../aggregate_function_binary.h                    |   4 +-
 .../aggregate_function_collect.h                   |   2 -
 .../aggregate_function_corr.cpp                    |   9 +
 .../aggregate_function_distinct.h                  |   2 -
 .../aggregate_function_foreach.h                   |   4 -
 .../aggregate_function_group_array_intersect.h     |  14 +-
 .../aggregate_functions/aggregate_function_null.h  |   8 -
 .../aggregate_function_orthogonal_bitmap.h         |  40 +-
 .../aggregate_functions/aggregate_function_uniq.h  |   4 +
 .../aggregate_function_uniq_distribute_key.h       |   7 +
 .../aggregate_function_window_funnel.h             |  52 +-
 .../test_aggregate_window_functions.out            | 822 +++++++++++++++++++++
 .../test_aggregate_window_functions.groovy         | 523 +++++++++++++
 15 files changed, 1442 insertions(+), 53 deletions(-)

diff --git a/be/src/pipeline/exec/analytic_source_operator.cpp 
b/be/src/pipeline/exec/analytic_source_operator.cpp
index 9b638b87832..dbfa16158df 100644
--- a/be/src/pipeline/exec/analytic_source_operator.cpp
+++ b/be/src/pipeline/exec/analytic_source_operator.cpp
@@ -579,6 +579,7 @@ Status AnalyticSourceOperatorX::prepare(RuntimeState* 
state) {
         SlotDescriptor* output_slot_desc = _output_tuple_desc->slots()[i];
         RETURN_IF_ERROR(_agg_functions[i]->prepare(state, _child_x->row_desc(),
                                                    intermediate_slot_desc, 
output_slot_desc));
+        _agg_functions[i]->set_version(state->be_exec_version());
         _change_to_nullable_flags.push_back(output_slot_desc->is_nullable() &&
                                             
!_agg_functions[i]->data_type()->is_nullable());
     }
diff --git a/be/src/vec/aggregate_functions/aggregate_function.h 
b/be/src/vec/aggregate_functions/aggregate_function.h
index 74700dff17f..9a2d2a6abb9 100644
--- a/be/src/vec/aggregate_functions/aggregate_function.h
+++ b/be/src/vec/aggregate_functions/aggregate_function.h
@@ -170,9 +170,6 @@ public:
     virtual void deserialize_and_merge_from_column(AggregateDataPtr __restrict 
place,
                                                    const IColumn& column, 
Arena* arena) const = 0;
 
-    /// Returns true if a function requires Arena to handle own states (see 
add(), merge(), deserialize()).
-    virtual bool allocates_memory_in_arena() const { return false; }
-
     /// Inserts results into a column.
     virtual void insert_result_into(ConstAggregateDataPtr __restrict place, 
IColumn& to) const = 0;
 
diff --git a/be/src/vec/aggregate_functions/aggregate_function_binary.h 
b/be/src/vec/aggregate_functions/aggregate_function_binary.h
index a5b6e2b1e0e..9fba9d11a10 100644
--- a/be/src/vec/aggregate_functions/aggregate_function_binary.h
+++ b/be/src/vec/aggregate_functions/aggregate_function_binary.h
@@ -62,12 +62,12 @@ struct AggregateFunctionBinary
 
     String get_name() const override { return StatFunc::Data::name(); }
 
+    void reset(AggregateDataPtr __restrict place) const override { 
this->data(place).reset(); }
+
     DataTypePtr get_return_type() const override {
         return std::make_shared<DataTypeNumber<ResultType>>();
     }
 
-    bool allocates_memory_in_arena() const override { return false; }
-
     void add(AggregateDataPtr __restrict place, const IColumn** columns, 
ssize_t row_num,
              Arena*) const override {
         this->data(place).add(
diff --git a/be/src/vec/aggregate_functions/aggregate_function_collect.h 
b/be/src/vec/aggregate_functions/aggregate_function_collect.h
index 4da6e023eb3..dcbab056bf0 100644
--- a/be/src/vec/aggregate_functions/aggregate_function_collect.h
+++ b/be/src/vec/aggregate_functions/aggregate_function_collect.h
@@ -553,8 +553,6 @@ public:
         return std::make_shared<DataTypeArray>(make_nullable(return_type));
     }
 
-    bool allocates_memory_in_arena() const override { return ENABLE_ARENA; }
-
     void add(AggregateDataPtr __restrict place, const IColumn** columns, 
ssize_t row_num,
              Arena* arena) const override {
         auto& data = this->data(place);
diff --git a/be/src/vec/aggregate_functions/aggregate_function_corr.cpp 
b/be/src/vec/aggregate_functions/aggregate_function_corr.cpp
index 8237f588298..a454afb45f2 100644
--- a/be/src/vec/aggregate_functions/aggregate_function_corr.cpp
+++ b/be/src/vec/aggregate_functions/aggregate_function_corr.cpp
@@ -76,6 +76,15 @@ struct CorrMoment {
     }
 
     static String name() { return "corr"; }
+
+    void reset() {
+        m0 = {};
+        x1 = {};
+        y1 = {};
+        xy = {};
+        x2 = {};
+        y2 = {};
+    }
 };
 
 AggregateFunctionPtr create_aggregate_corr_function(const std::string& name,
diff --git a/be/src/vec/aggregate_functions/aggregate_function_distinct.h 
b/be/src/vec/aggregate_functions/aggregate_function_distinct.h
index 4f42e8509f2..455640f8214 100644
--- a/be/src/vec/aggregate_functions/aggregate_function_distinct.h
+++ b/be/src/vec/aggregate_functions/aggregate_function_distinct.h
@@ -336,8 +336,6 @@ public:
 
     DataTypePtr get_return_type() const override { return 
nested_func->get_return_type(); }
 
-    bool allocates_memory_in_arena() const override { return true; }
-
     AggregateFunctionPtr transmit_to_stable() override {
         return AggregateFunctionPtr(new AggregateFunctionDistinct<Data, true>(
                 nested_func, IAggregateFunction::argument_types));
diff --git a/be/src/vec/aggregate_functions/aggregate_function_foreach.h 
b/be/src/vec/aggregate_functions/aggregate_function_foreach.h
index bef52a906cf..d2aa6c1e66e 100644
--- a/be/src/vec/aggregate_functions/aggregate_function_foreach.h
+++ b/be/src/vec/aggregate_functions/aggregate_function_foreach.h
@@ -219,10 +219,6 @@ public:
         offsets_to.push_back(offsets_to.back() + state.dynamic_array_size);
     }
 
-    bool allocates_memory_in_arena() const override {
-        return nested_function->allocates_memory_in_arena();
-    }
-
     void add(AggregateDataPtr __restrict place, const IColumn** columns, 
ssize_t row_num,
              Arena* arena) const override {
         const IColumn* nested[num_arguments];
diff --git 
a/be/src/vec/aggregate_functions/aggregate_function_group_array_intersect.h 
b/be/src/vec/aggregate_functions/aggregate_function_group_array_intersect.h
index 5d627782f25..f37645bca77 100644
--- a/be/src/vec/aggregate_functions/aggregate_function_group_array_intersect.h
+++ b/be/src/vec/aggregate_functions/aggregate_function_group_array_intersect.h
@@ -93,6 +93,11 @@ struct AggregateFunctionGroupArrayIntersectData {
     Set value;
     bool init = false;
 
+    void reset() {
+        init = false;
+        value = std::make_unique<NullableNumericOrDateSetType>();
+    }
+
     void process_col_data(auto& column_data, size_t offset, size_t arr_size, 
bool& init, Set& set) {
         const bool is_column_data_nullable = column_data.is_nullable();
 
@@ -162,7 +167,7 @@ public:
 
     DataTypePtr get_return_type() const override { return argument_type; }
 
-    bool allocates_memory_in_arena() const override { return false; }
+    void reset(AggregateDataPtr __restrict place) const override { 
this->data(place).reset(); }
 
     void add(AggregateDataPtr __restrict place, const IColumn** columns, 
ssize_t row_num,
              Arena*) const override {
@@ -328,6 +333,11 @@ struct AggregateFunctionGroupArrayIntersectGenericData {
             : value(std::make_unique<NullableStringSet>()) {}
     Set value;
     bool init = false;
+
+    void reset() {
+        init = false;
+        value = std::make_unique<NullableStringSet>();
+    }
 };
 
 /** Template parameter with true value should be used for columns that store 
their elements in memory continuously.
@@ -354,7 +364,7 @@ public:
 
     DataTypePtr get_return_type() const override { return input_data_type; }
 
-    bool allocates_memory_in_arena() const override { return true; }
+    void reset(AggregateDataPtr __restrict place) const override { 
this->data(place).reset(); }
 
     void add(AggregateDataPtr __restrict place, const IColumn** columns, 
ssize_t row_num,
              Arena* arena) const override {
diff --git a/be/src/vec/aggregate_functions/aggregate_function_null.h 
b/be/src/vec/aggregate_functions/aggregate_function_null.h
index 59854c2a2b4..53cad4e3b15 100644
--- a/be/src/vec/aggregate_functions/aggregate_function_null.h
+++ b/be/src/vec/aggregate_functions/aggregate_function_null.h
@@ -176,10 +176,6 @@ public:
             nested_function->insert_result_into(nested_place(place), to);
         }
     }
-
-    bool allocates_memory_in_arena() const override {
-        return nested_function->allocates_memory_in_arena();
-    }
 };
 
 /** There are two cases: for single argument and variadic.
@@ -323,10 +319,6 @@ public:
         this->nested_function->add(this->nested_place(place), nested_columns, 
row_num, arena);
     }
 
-    bool allocates_memory_in_arena() const override {
-        return this->nested_function->allocates_memory_in_arena();
-    }
-
 private:
     // The array length is fixed in the implementation of some aggregate 
functions.
     // Therefore we choose 256 as the appropriate maximum length limit.
diff --git 
a/be/src/vec/aggregate_functions/aggregate_function_orthogonal_bitmap.h 
b/be/src/vec/aggregate_functions/aggregate_function_orthogonal_bitmap.h
index d7de66681ed..2a7dbd44b8a 100644
--- a/be/src/vec/aggregate_functions/aggregate_function_orthogonal_bitmap.h
+++ b/be/src/vec/aggregate_functions/aggregate_function_orthogonal_bitmap.h
@@ -52,6 +52,11 @@ struct AggOrthBitmapBaseData {
 public:
     using ColVecData = std::conditional_t<IsNumber<T>, ColumnVector<T>, 
ColumnString>;
 
+    void reset() {
+        bitmap = {};
+        first_init = true;
+    }
+
     void add(const IColumn** columns, size_t row_num) {
         const auto& bitmap_col = assert_cast<const ColumnBitmap&>(*columns[0]);
         const auto& data_col = assert_cast<const ColVecData&>(*columns[1]);
@@ -96,6 +101,11 @@ public:
 
     static DataTypePtr get_return_type() { return 
std::make_shared<DataTypeBitMap>(); }
 
+    void reset() {
+        AggOrthBitmapBaseData<T>::reset();
+        result.reset();
+    }
+
     void merge(const AggOrthBitMapIntersect& rhs) {
         if (rhs.first_init) {
             return;
@@ -117,7 +127,8 @@ public:
 
     void get(IColumn& to) const {
         auto& column = assert_cast<ColumnBitmap&>(to);
-        column.get_data().emplace_back(result);
+        column.get_data().emplace_back(result.empty() ? 
AggOrthBitmapBaseData<T>::bitmap.intersect()
+                                                      : result);
     }
 
 private:
@@ -167,6 +178,11 @@ public:
 
     static DataTypePtr get_return_type() { return 
std::make_shared<DataTypeInt64>(); }
 
+    void reset() {
+        AggOrthBitmapBaseData<T>::reset();
+        result = 0;
+    }
+
     void merge(const AggOrthBitMapIntersectCount& rhs) {
         if (rhs.first_init) {
             return;
@@ -219,6 +235,11 @@ public:
         }
     }
 
+    void reset() {
+        bitmap_expr_cal = {};
+        first_init = true;
+    }
+
 protected:
     doris::BitmapExprCalculation bitmap_expr_cal;
     bool first_init = true;
@@ -257,6 +278,11 @@ public:
                                                          
->bitmap_expr_cal.bitmap_calculate());
     }
 
+    void reset() {
+        AggOrthBitmapExprCalBaseData<T>::reset();
+        result.reset();
+    }
+
 private:
     BitmapValue result;
 };
@@ -293,6 +319,11 @@ public:
                                                         
->bitmap_expr_cal.bitmap_calculate_count());
     }
 
+    void reset() {
+        AggOrthBitmapExprCalBaseData<T>::reset();
+        result = 0;
+    }
+
 private:
     int64_t result = 0;
 };
@@ -323,6 +354,11 @@ struct OrthBitmapUnionCountData {
         column.get_data().emplace_back(result ? result : value.cardinality());
     }
 
+    void reset() {
+        value.reset();
+        result = 0;
+    }
+
 private:
     BitmapValue value;
     int64_t result = 0;
@@ -340,6 +376,8 @@ public:
 
     DataTypePtr get_return_type() const override { return 
Impl::get_return_type(); }
 
+    void reset(AggregateDataPtr __restrict place) const override { 
this->data(place).reset(); }
+
     void add(AggregateDataPtr __restrict place, const IColumn** columns, 
ssize_t row_num,
              Arena*) const override {
         this->data(place).init_add_key(columns, row_num, _argument_size);
diff --git a/be/src/vec/aggregate_functions/aggregate_function_uniq.h 
b/be/src/vec/aggregate_functions/aggregate_function_uniq.h
index 58abd3842c2..dff72c49b3c 100644
--- a/be/src/vec/aggregate_functions/aggregate_function_uniq.h
+++ b/be/src/vec/aggregate_functions/aggregate_function_uniq.h
@@ -76,6 +76,8 @@ struct AggregateFunctionUniqExactData {
     Set set;
 
     static String get_name() { return "multi_distinct"; }
+
+    void reset() { set.clear(); }
 };
 
 namespace detail {
@@ -112,6 +114,8 @@ public:
 
     DataTypePtr get_return_type() const override { return 
std::make_shared<DataTypeInt64>(); }
 
+    void reset(AggregateDataPtr __restrict place) const override { 
this->data(place).reset(); }
+
     void add(AggregateDataPtr __restrict place, const IColumn** columns, 
ssize_t row_num,
              Arena*) const override {
         detail::OneAdder<T, Data>::add(this->data(place), *columns[0], 
row_num);
diff --git 
a/be/src/vec/aggregate_functions/aggregate_function_uniq_distribute_key.h 
b/be/src/vec/aggregate_functions/aggregate_function_uniq_distribute_key.h
index 3eaa6418f0b..4c3fa67e162 100644
--- a/be/src/vec/aggregate_functions/aggregate_function_uniq_distribute_key.h
+++ b/be/src/vec/aggregate_functions/aggregate_function_uniq_distribute_key.h
@@ -68,6 +68,11 @@ struct AggregateFunctionUniqDistributeKeyData {
 
     Set set;
     UInt64 count = 0;
+
+    void reset() {
+        set.clear();
+        count = 0;
+    }
 };
 
 template <typename T, typename Data>
@@ -83,6 +88,8 @@ public:
 
     DataTypePtr get_return_type() const override { return 
std::make_shared<DataTypeInt64>(); }
 
+    void reset(AggregateDataPtr __restrict place) const override { 
this->data(place).reset(); }
+
     void add(AggregateDataPtr __restrict place, const IColumn** columns, 
ssize_t row_num,
              Arena*) const override {
         detail::OneAdder<T, Data>::add(this->data(place), *columns[0], 
row_num);
diff --git a/be/src/vec/aggregate_functions/aggregate_function_window_funnel.h 
b/be/src/vec/aggregate_functions/aggregate_function_window_funnel.h
index 8e3efb9c613..e6697968403 100644
--- a/be/src/vec/aggregate_functions/aggregate_function_window_funnel.h
+++ b/be/src/vec/aggregate_functions/aggregate_function_window_funnel.h
@@ -84,10 +84,9 @@ struct WindowFunnelState {
     bool enable_mode;
     WindowFunnelMode window_funnel_mode;
     mutable vectorized::MutableBlock mutable_block;
-    ColumnVector<NativeType>::Container* timestamp_column_data;
+    ColumnVector<NativeType>::Container* timestamp_column_data = nullptr;
     std::vector<ColumnVector<UInt8>::Container*> event_columns_datas;
     SortDescription sort_description {1};
-    bool sorted;
 
     WindowFunnelState() {
         event_count = 0;
@@ -97,20 +96,15 @@ struct WindowFunnelState {
         sort_description[0].column_number = 0;
         sort_description[0].direction = 1;
         sort_description[0].nulls_direction = -1;
-        sorted = false;
     }
     WindowFunnelState(int arg_event_count) : WindowFunnelState() {
         event_count = arg_event_count;
+        event_columns_datas.resize(event_count);
         auto timestamp_column = ColumnVector<NativeType>::create();
-        timestamp_column_data =
-                
&assert_cast<ColumnVector<NativeType>&>(*timestamp_column).get_data();
 
         MutableColumns event_columns;
         for (int i = 0; i < event_count; i++) {
-            auto event_column = ColumnVector<UInt8>::create();
-            event_columns_datas.emplace_back(
-                    
&assert_cast<ColumnVector<UInt8>&>(*event_column).get_data());
-            event_columns.emplace_back(std::move(event_column));
+            event_columns.emplace_back(ColumnVector<UInt8>::create());
         }
         Block tmp_block;
         tmp_block.insert({std::move(timestamp_column),
@@ -122,15 +116,18 @@ struct WindowFunnelState {
         }
 
         mutable_block = MutableBlock(std::move(tmp_block));
+        _reset_columns_ptr();
     }
 
-    void reset() {
-        window = 0;
-        mutable_block.clear();
-        timestamp_column_data = nullptr;
-        event_columns_datas.clear();
-        sorted = false;
+    void _reset_columns_ptr() {
+        auto& ts_column = mutable_block.get_column_by_position(0);
+        timestamp_column_data = 
&assert_cast<ColumnVector<NativeType>&>(*ts_column).get_data();
+        for (int i = 0; i != event_count; i++) {
+            auto& event_column = mutable_block.get_column_by_position(i + 1);
+            event_columns_datas[i] = 
&assert_cast<ColumnVector<UInt8>&>(*event_column).get_data();
+        }
     }
+    void reset() { mutable_block.clear_column_data(); }
 
     void add(const IColumn** arg_columns, ssize_t row_num, int64_t win, 
WindowFunnelMode mode) {
         window = win;
@@ -146,26 +143,23 @@ struct WindowFunnelState {
     }
 
     void sort() {
-        if (sorted) {
-            return;
-        }
-
         Block tmp_block = mutable_block.to_block();
         auto block = tmp_block.clone_without_columns();
         sort_block(tmp_block, block, sort_description, 0);
-        mutable_block = MutableBlock(std::move(block));
-        sorted = true;
+        mutable_block = std::move(block);
+        _reset_columns_ptr();
     }
 
     template <WindowFunnelMode WINDOW_FUNNEL_MODE>
-    int _match_event_list(size_t& start_row, size_t row_count,
-                          const NativeType* timestamp_data) const {
+    int _match_event_list(size_t& start_row, size_t row_count) const {
         int matched_count = 0;
         DateValueType start_timestamp;
         DateValueType end_timestamp;
         TimeInterval interval(SECOND, window, false);
 
         int column_idx = 1;
+
+        const NativeType* timestamp_data = timestamp_column_data->data();
         const auto& first_event_column = 
mutable_block.get_column_by_position(column_idx);
         const auto& first_event_data =
                 assert_cast<const 
ColumnVector<UInt8>&>(*first_event_column).get_data();
@@ -250,14 +244,9 @@ struct WindowFunnelState {
     int _get_internal() const {
         size_t start_row = 0;
         int max_found_event_count = 0;
-        const auto& ts_column = 
mutable_block.get_column_by_position(0)->get_ptr();
-        const auto& timestamp_data =
-                assert_cast<const 
ColumnVector<NativeType>&>(*ts_column).get_data().data();
-
         auto row_count = mutable_block.rows();
         while (start_row < row_count) {
-            auto found_event_count =
-                    _match_event_list<WINDOW_FUNNEL_MODE>(start_row, 
row_count, timestamp_data);
+            auto found_event_count = 
_match_event_list<WINDOW_FUNNEL_MODE>(start_row, row_count);
             if (found_event_count == event_count) {
                 return found_event_count;
             }
@@ -322,6 +311,7 @@ struct WindowFunnelState {
                 BeExecVersionManager::get_newest_version(), &pblock, 
&uncompressed_bytes,
                 &compressed_bytes,
                 segment_v2::CompressionTypePB::ZSTD); // ZSTD for better 
compression ratio
+        block.clear_column_data();
         if (!status.ok()) {
             throw doris::Exception(ErrorCode::INTERNAL_ERROR, 
status.to_string());
             return;
@@ -334,6 +324,9 @@ struct WindowFunnelState {
         auto data_bytes = buff.size();
         write_var_uint(data_bytes, out);
         out.write(buff.data(), data_bytes);
+
+        mutable_block = std::move(block);
+        const_cast<WindowFunnelState<TYPE_INDEX, 
NativeType>*>(this)->_reset_columns_ptr();
     }
 
     void read(BufferReadable& in) {
@@ -364,6 +357,7 @@ struct WindowFunnelState {
             throw doris::Exception(ErrorCode::INTERNAL_ERROR, 
status.to_string());
         }
         mutable_block = MutableBlock(std::move(block));
+        _reset_columns_ptr();
     }
 };
 
diff --git 
a/regression-test/data/nereids_p0/sql_functions/aggregate_functions/test_aggregate_window_functions.out
 
b/regression-test/data/nereids_p0/sql_functions/aggregate_functions/test_aggregate_window_functions.out
new file mode 100644
index 00000000000..6729ea26bc1
--- /dev/null
+++ 
b/regression-test/data/nereids_p0/sql_functions/aggregate_functions/test_aggregate_window_functions.out
@@ -0,0 +1,822 @@
+-- This file is automatically generated. You should know what you did if you 
want to edit this
+-- !agg_window_approx_count_distinct --
+beijing        3
+beijing        3
+beijing        3
+beijing        3
+chongqing      2
+chongqing      2
+hubei  3
+hubei  3
+hubei  3
+sichuan        2
+sichuan        2
+sichuan        2
+sichuan        2
+
+-- !agg_window_count_by_enum --
+beijing        [{"cbe":{"liuxiang":1},"notnull":1,"null":0,"all":1}]
+beijing        
[{"cbe":{"liuxiang2":1,"liuxiang":1},"notnull":2,"null":0,"all":2}]
+beijing        
[{"cbe":{"wangmang":2,"liuxiang2":1,"liuxiang":1},"notnull":4,"null":0,"all":4}]
+beijing        
[{"cbe":{"wangmang":2,"liuxiang2":1,"liuxiang":1},"notnull":4,"null":0,"all":4}]
+chongqing      [{"cbe":{"lisi":1},"notnull":1,"null":0,"all":1}]
+chongqing      [{"cbe":{"lisi2":1,"lisi":1},"notnull":2,"null":0,"all":2}]
+hubei  [{"cbe":{"quyuan":1},"notnull":1,"null":0,"all":1}]
+hubei  [{"cbe":{"wangwu":1,"quyuan":1},"notnull":2,"null":0,"all":2}]
+hubei  
[{"cbe":{"wangwu2":1,"wangwu":1,"quyuan":1},"notnull":3,"null":0,"all":3}]
+sichuan        [{"cbe":{"zhangsan":2},"notnull":2,"null":1,"all":3}]
+sichuan        [{"cbe":{"zhangsan":2},"notnull":2,"null":1,"all":3}]
+sichuan        [{"cbe":{"zhuge":1,"zhangsan":2},"notnull":3,"null":1,"all":4}]
+sichuan        [{"cbe":{},"notnull":0,"null":1,"all":1}]
+
+-- !agg_window_avg_weighted --
+1      4.787199468947368E8
+1      4.787199468947368E8
+1      4.787199468947368E8
+1      4.787199468947368E8
+1      4.787199468947368E8
+1      4.787199468947368E8
+1      4.787199468947368E8
+2      2.7563070204347825E8
+2      2.7563070204347825E8
+2      2.7563070204347825E8
+2      2.7563070204347825E8
+2      2.7563070204347825E8
+3      3.4926324084193546E8
+3      3.4926324084193546E8
+3      3.4926324084193546E8
+3      3.4926324084193546E8
+3      3.4926324084193546E8
+
+-- !agg_window_corr --
+1      0.7619441542729813
+1      0.7619441542729813
+1      0.7619441542729813
+1      0.7619441542729813
+1      0.7619441542729813
+1      0.7619441542729813
+1      0.7619441542729813
+2      0.4220928990265549
+2      0.4220928990265549
+2      0.4220928990265549
+2      0.4220928990265549
+2      0.4220928990265549
+3      0.9986446796711458
+3      0.9986446796711458
+3      0.9986446796711458
+3      0.9986446796711458
+3      0.9986446796711458
+
+-- !agg_window_covar_samp --
+1      9.266666666666666E10
+1      9.266666666666666E10
+1      9.266666666666666E10
+1      9.266666666666666E10
+1      9.266666666666666E10
+1      9.266666666666666E10
+1      9.266666666666666E10
+2      1.85E10
+2      1.85E10
+2      1.85E10
+2      1.85E10
+2      1.85E10
+3      1.5666666662333337E11
+3      1.5666666662333337E11
+3      1.5666666662333337E11
+3      1.5666666662333337E11
+3      1.5666666662333337E11
+
+-- !agg_window_covar_pop --
+1      7.722222222222223E10
+1      7.722222222222223E10
+1      7.722222222222223E10
+1      7.722222222222223E10
+1      7.722222222222223E10
+1      7.722222222222223E10
+1      7.722222222222223E10
+2      1.48E10
+2      1.48E10
+2      1.48E10
+2      1.48E10
+2      1.48E10
+3      1.174999999675E11
+3      1.174999999675E11
+3      1.174999999675E11
+3      1.174999999675E11
+3      1.174999999675E11
+
+-- !agg_window_variance_pop --
+1      2.2448979591836736E16
+1      2.2448979591836736E16
+1      2.2448979591836736E16
+1      2.2448979591836736E16
+1      2.2448979591836736E16
+1      2.2448979591836736E16
+1      2.2448979591836736E16
+2      1.36E16
+2      1.36E16
+2      1.36E16
+2      1.36E16
+2      1.36E16
+3      1.0399999990400002E16
+3      1.0399999990400002E16
+3      1.0399999990400002E16
+3      1.0399999990400002E16
+3      1.0399999990400002E16
+
+-- !agg_window_stddev_pop --
+1      1.498298354528788E8
+1      1.498298354528788E8
+1      1.498298354528788E8
+1      1.498298354528788E8
+1      1.498298354528788E8
+1      1.498298354528788E8
+1      1.498298354528788E8
+2      1.16619037896906E8
+2      1.16619037896906E8
+2      1.16619037896906E8
+2      1.16619037896906E8
+2      1.16619037896906E8
+3      1.0198039022478783E8
+3      1.0198039022478783E8
+3      1.0198039022478783E8
+3      1.0198039022478783E8
+3      1.0198039022478783E8
+
+-- !agg_window_variance_samp --
+1      2.6190476190476192E16
+1      2.6190476190476192E16
+1      2.6190476190476192E16
+1      2.6190476190476192E16
+1      2.6190476190476192E16
+1      2.6190476190476192E16
+1      2.6190476190476192E16
+2      1.7E16
+2      1.7E16
+2      1.7E16
+2      1.7E16
+2      1.7E16
+3      1.2999999988000002E16
+3      1.2999999988000002E16
+3      1.2999999988000002E16
+3      1.2999999988000002E16
+3      1.2999999988000002E16
+
+-- !agg_window_stddev_samp --
+1      1.618347187425374E8
+1      1.618347187425374E8
+1      1.618347187425374E8
+1      1.618347187425374E8
+1      1.618347187425374E8
+1      1.618347187425374E8
+1      1.618347187425374E8
+2      1.3038404810405298E8
+2      1.3038404810405298E8
+2      1.3038404810405298E8
+2      1.3038404810405298E8
+2      1.3038404810405298E8
+3      1.1401754245729032E8
+3      1.1401754245729032E8
+3      1.1401754245729032E8
+3      1.1401754245729032E8
+3      1.1401754245729032E8
+
+-- !agg_window_group_bit_or --
+1      2044
+1      2044
+1      2044
+1      2044
+1      2044
+1      2044
+1      2044
+2      1020
+2      1020
+2      1020
+2      1020
+2      1020
+3      4088
+3      4088
+3      4088
+3      4088
+3      4088
+
+-- !agg_window_group_bit_and --
+1      0
+1      0
+1      0
+1      0
+1      0
+1      0
+1      0
+2      0
+2      0
+2      0
+2      0
+2      0
+3      128
+3      128
+3      128
+3      128
+3      128
+
+-- !agg_window_group_bit_xor --
+1      1392
+1      1392
+1      1392
+1      1392
+1      1392
+1      1392
+1      1392
+2      708
+2      708
+2      708
+2      708
+2      708
+3      3912
+3      3912
+3      3912
+3      3912
+3      3912
+
+-- !agg_window_bitmap_agg --
+1      100,200,300,1000,2000
+1      100,200,300,1000,2000
+1      100,200,300,1000,2000
+1      100,200,300,1000,2000
+1      100,200,300,1000,2000
+1      100,200,300,1000,2000
+1      100,200,300,1000,2000
+2      100,300,400,500,1000
+2      100,300,400,500,1000
+2      100,300,400,500,1000
+2      100,300,400,500,1000
+2      100,300,400,500,1000
+3      200,1000,2000,3000
+3      200,1000,2000,3000
+3      200,1000,2000,3000
+3      200,1000,2000,3000
+3      200,1000,2000,3000
+
+-- !agg_window_bitmap_union_int --
+1      5
+1      5
+1      5
+1      5
+1      5
+1      5
+1      5
+2      5
+2      5
+2      5
+2      5
+2      5
+3      4
+3      4
+3      4
+3      4
+3      4
+
+-- !agg_window_histogram --
+1      
{"num_buckets":5,"buckets":[{"lower":"100","upper":"100","ndv":1,"count":1,"pre_sum":0},{"lower":"200","upper":"200","ndv":1,"count":2,"pre_sum":1},{"lower":"300","upper":"300","ndv":1,"count":1,"pre_sum":3},{"lower":"1000","upper":"1000","ndv":1,"count":1,"pre_sum":4},{"lower":"2000","upper":"2000","ndv":1,"count":1,"pre_sum":5}]}
+1      
{"num_buckets":5,"buckets":[{"lower":"100","upper":"100","ndv":1,"count":1,"pre_sum":0},{"lower":"200","upper":"200","ndv":1,"count":2,"pre_sum":1},{"lower":"300","upper":"300","ndv":1,"count":1,"pre_sum":3},{"lower":"1000","upper":"1000","ndv":1,"count":1,"pre_sum":4},{"lower":"2000","upper":"2000","ndv":1,"count":1,"pre_sum":5}]}
+1      
{"num_buckets":5,"buckets":[{"lower":"100","upper":"100","ndv":1,"count":1,"pre_sum":0},{"lower":"200","upper":"200","ndv":1,"count":2,"pre_sum":1},{"lower":"300","upper":"300","ndv":1,"count":1,"pre_sum":3},{"lower":"1000","upper":"1000","ndv":1,"count":1,"pre_sum":4},{"lower":"2000","upper":"2000","ndv":1,"count":1,"pre_sum":5}]}
+1      
{"num_buckets":5,"buckets":[{"lower":"100","upper":"100","ndv":1,"count":1,"pre_sum":0},{"lower":"200","upper":"200","ndv":1,"count":2,"pre_sum":1},{"lower":"300","upper":"300","ndv":1,"count":1,"pre_sum":3},{"lower":"1000","upper":"1000","ndv":1,"count":1,"pre_sum":4},{"lower":"2000","upper":"2000","ndv":1,"count":1,"pre_sum":5}]}
+1      
{"num_buckets":5,"buckets":[{"lower":"100","upper":"100","ndv":1,"count":1,"pre_sum":0},{"lower":"200","upper":"200","ndv":1,"count":2,"pre_sum":1},{"lower":"300","upper":"300","ndv":1,"count":1,"pre_sum":3},{"lower":"1000","upper":"1000","ndv":1,"count":1,"pre_sum":4},{"lower":"2000","upper":"2000","ndv":1,"count":1,"pre_sum":5}]}
+1      
{"num_buckets":5,"buckets":[{"lower":"100","upper":"100","ndv":1,"count":1,"pre_sum":0},{"lower":"200","upper":"200","ndv":1,"count":2,"pre_sum":1},{"lower":"300","upper":"300","ndv":1,"count":1,"pre_sum":3},{"lower":"1000","upper":"1000","ndv":1,"count":1,"pre_sum":4},{"lower":"2000","upper":"2000","ndv":1,"count":1,"pre_sum":5}]}
+1      
{"num_buckets":5,"buckets":[{"lower":"100","upper":"100","ndv":1,"count":1,"pre_sum":0},{"lower":"200","upper":"200","ndv":1,"count":2,"pre_sum":1},{"lower":"300","upper":"300","ndv":1,"count":1,"pre_sum":3},{"lower":"1000","upper":"1000","ndv":1,"count":1,"pre_sum":4},{"lower":"2000","upper":"2000","ndv":1,"count":1,"pre_sum":5}]}
+2      
{"num_buckets":5,"buckets":[{"lower":"100","upper":"100","ndv":1,"count":1,"pre_sum":0},{"lower":"300","upper":"300","ndv":1,"count":1,"pre_sum":1},{"lower":"400","upper":"400","ndv":1,"count":1,"pre_sum":2},{"lower":"500","upper":"500","ndv":1,"count":1,"pre_sum":3},{"lower":"1000","upper":"1000","ndv":1,"count":1,"pre_sum":4}]}
+2      
{"num_buckets":5,"buckets":[{"lower":"100","upper":"100","ndv":1,"count":1,"pre_sum":0},{"lower":"300","upper":"300","ndv":1,"count":1,"pre_sum":1},{"lower":"400","upper":"400","ndv":1,"count":1,"pre_sum":2},{"lower":"500","upper":"500","ndv":1,"count":1,"pre_sum":3},{"lower":"1000","upper":"1000","ndv":1,"count":1,"pre_sum":4}]}
+2      
{"num_buckets":5,"buckets":[{"lower":"100","upper":"100","ndv":1,"count":1,"pre_sum":0},{"lower":"300","upper":"300","ndv":1,"count":1,"pre_sum":1},{"lower":"400","upper":"400","ndv":1,"count":1,"pre_sum":2},{"lower":"500","upper":"500","ndv":1,"count":1,"pre_sum":3},{"lower":"1000","upper":"1000","ndv":1,"count":1,"pre_sum":4}]}
+2      
{"num_buckets":5,"buckets":[{"lower":"100","upper":"100","ndv":1,"count":1,"pre_sum":0},{"lower":"300","upper":"300","ndv":1,"count":1,"pre_sum":1},{"lower":"400","upper":"400","ndv":1,"count":1,"pre_sum":2},{"lower":"500","upper":"500","ndv":1,"count":1,"pre_sum":3},{"lower":"1000","upper":"1000","ndv":1,"count":1,"pre_sum":4}]}
+2      
{"num_buckets":5,"buckets":[{"lower":"100","upper":"100","ndv":1,"count":1,"pre_sum":0},{"lower":"300","upper":"300","ndv":1,"count":1,"pre_sum":1},{"lower":"400","upper":"400","ndv":1,"count":1,"pre_sum":2},{"lower":"500","upper":"500","ndv":1,"count":1,"pre_sum":3},{"lower":"1000","upper":"1000","ndv":1,"count":1,"pre_sum":4}]}
+3      
{"num_buckets":4,"buckets":[{"lower":"200","upper":"200","ndv":1,"count":1,"pre_sum":0},{"lower":"1000","upper":"1000","ndv":1,"count":1,"pre_sum":1},{"lower":"2000","upper":"2000","ndv":1,"count":1,"pre_sum":2},{"lower":"3000","upper":"3000","ndv":1,"count":1,"pre_sum":3}]}
+3      
{"num_buckets":4,"buckets":[{"lower":"200","upper":"200","ndv":1,"count":1,"pre_sum":0},{"lower":"1000","upper":"1000","ndv":1,"count":1,"pre_sum":1},{"lower":"2000","upper":"2000","ndv":1,"count":1,"pre_sum":2},{"lower":"3000","upper":"3000","ndv":1,"count":1,"pre_sum":3}]}
+3      
{"num_buckets":4,"buckets":[{"lower":"200","upper":"200","ndv":1,"count":1,"pre_sum":0},{"lower":"1000","upper":"1000","ndv":1,"count":1,"pre_sum":1},{"lower":"2000","upper":"2000","ndv":1,"count":1,"pre_sum":2},{"lower":"3000","upper":"3000","ndv":1,"count":1,"pre_sum":3}]}
+3      
{"num_buckets":4,"buckets":[{"lower":"200","upper":"200","ndv":1,"count":1,"pre_sum":0},{"lower":"1000","upper":"1000","ndv":1,"count":1,"pre_sum":1},{"lower":"2000","upper":"2000","ndv":1,"count":1,"pre_sum":2},{"lower":"3000","upper":"3000","ndv":1,"count":1,"pre_sum":3}]}
+3      
{"num_buckets":4,"buckets":[{"lower":"200","upper":"200","ndv":1,"count":1,"pre_sum":0},{"lower":"1000","upper":"1000","ndv":1,"count":1,"pre_sum":1},{"lower":"2000","upper":"2000","ndv":1,"count":1,"pre_sum":2},{"lower":"3000","upper":"3000","ndv":1,"count":1,"pre_sum":3}]}
+
+-- !agg_window_max_by --
+1      \N      \N
+1      100     123456789.0000000001
+1      1000    523456789.0000000005
+1      200     223456789.0000000004
+1      200     223456789.0000000004
+1      2000    523456789.0000000005
+1      300     423456789.0000000005
+2      100     323456789.0000000005
+2      1000    423456789.0000000005
+2      300     223456789.0000000005
+2      400     123456789.0000000005
+2      500     123456789.0000000006
+3      \N      \N
+3      1000    223456789.6000000005
+3      200     123456789.1000000005
+3      2000    323456789.1000000005
+3      3000    423456789.2000000005
+
+-- !agg_window_min_by --
+1      \N      \N
+1      100     123456789.0000000001
+1      1000    123456789.0000000001
+1      200     123456789.0000000001
+1      200     123456789.0000000001
+1      2000    123456789.0000000001
+1      300     123456789.0000000001
+2      100     323456789.0000000005
+2      1000    323456789.0000000005
+2      300     323456789.0000000005
+2      400     323456789.0000000005
+2      500     323456789.0000000005
+3      \N      \N
+3      1000    123456789.1000000005
+3      200     123456789.1000000005
+3      2000    123456789.1000000005
+3      3000    123456789.1000000005
+
+-- !agg_window_any_value --
+1      123456789.0000000001
+1      123456789.0000000001
+1      123456789.0000000001
+1      123456789.0000000001
+1      123456789.0000000001
+1      123456789.0000000001
+1      123456789.0000000001
+2      123456789.0000000005
+2      123456789.0000000005
+2      123456789.0000000005
+2      123456789.0000000005
+2      123456789.0000000005
+3      123456789.1000000005
+3      123456789.1000000005
+3      123456789.1000000005
+3      123456789.1000000005
+3      123456789.1000000005
+
+-- !agg_window_percentile --
+1      5.23456789E8
+1      5.23456789E8
+1      5.23456789E8
+1      5.23456789E8
+1      5.23456789E8
+1      5.23456789E8
+1      5.23456789E8
+2      4.03456789E8
+2      4.03456789E8
+2      4.03456789E8
+2      4.03456789E8
+2      4.03456789E8
+3      4.03456789E8
+3      4.03456789E8
+3      4.03456789E8
+3      4.03456789E8
+3      4.03456789E8
+
+-- !agg_window_percentile_array --
+1      [273456789, 423456789, 523456789]
+1      [273456789, 423456789, 523456789]
+1      [273456789, 423456789, 523456789]
+1      [273456789, 423456789, 523456789]
+1      [273456789, 423456789, 523456789]
+1      [273456789, 423456789, 523456789]
+1      [273456789, 423456789, 523456789]
+2      [123456789, 223456789, 323456789]
+2      [123456789, 223456789, 323456789]
+2      [123456789, 223456789, 323456789]
+2      [123456789, 223456789, 323456789]
+2      [123456789, 223456789, 323456789]
+3      [223456789, 223456789, 323456789]
+3      [223456789, 223456789, 323456789]
+3      [223456789, 223456789, 323456789]
+3      [223456789, 223456789, 323456789]
+3      [223456789, 223456789, 323456789]
+
+-- !agg_window_percentile_approx --
+1      5.234568E8
+1      5.234568E8
+1      5.234568E8
+1      5.234568E8
+1      5.234568E8
+1      5.234568E8
+1      5.234568E8
+2      4.234568E8
+2      4.234568E8
+2      4.234568E8
+2      4.234568E8
+2      4.234568E8
+3      4.234568E8
+3      4.234568E8
+3      4.234568E8
+3      4.234568E8
+3      4.234568E8
+
+-- !agg_window_percentile_approx_weighted --
+1      5.234568E8
+1      5.234568E8
+1      5.234568E8
+1      5.234568E8
+1      5.234568E8
+1      5.234568E8
+1      5.234568E8
+2      4.234568E8
+2      4.234568E8
+2      4.234568E8
+2      4.234568E8
+2      4.234568E8
+3      4.234568E8
+3      4.234568E8
+3      4.234568E8
+3      4.234568E8
+3      4.234568E8
+
+-- !agg_window_topn --
+1      
{"523456789.0000000005":3,"423456789.0000000005":1,"323456789.0000000002":1}
+1      
{"523456789.0000000005":3,"423456789.0000000005":1,"323456789.0000000002":1}
+1      
{"523456789.0000000005":3,"423456789.0000000005":1,"323456789.0000000002":1}
+1      
{"523456789.0000000005":3,"423456789.0000000005":1,"323456789.0000000002":1}
+1      
{"523456789.0000000005":3,"423456789.0000000005":1,"323456789.0000000002":1}
+1      
{"523456789.0000000005":3,"423456789.0000000005":1,"323456789.0000000002":1}
+1      
{"523456789.0000000005":3,"423456789.0000000005":1,"323456789.0000000002":1}
+2      
{"423456789.0000000005":1,"323456789.0000000005":1,"223456789.0000000005":1}
+2      
{"423456789.0000000005":1,"323456789.0000000005":1,"223456789.0000000005":1}
+2      
{"423456789.0000000005":1,"323456789.0000000005":1,"223456789.0000000005":1}
+2      
{"423456789.0000000005":1,"323456789.0000000005":1,"223456789.0000000005":1}
+2      
{"423456789.0000000005":1,"323456789.0000000005":1,"223456789.0000000005":1}
+3      
{"223456789.6000000005":2,"423456789.2000000005":1,"323456789.1000000005":1}
+3      
{"223456789.6000000005":2,"423456789.2000000005":1,"323456789.1000000005":1}
+3      
{"223456789.6000000005":2,"423456789.2000000005":1,"323456789.1000000005":1}
+3      
{"223456789.6000000005":2,"423456789.2000000005":1,"323456789.1000000005":1}
+3      
{"223456789.6000000005":2,"423456789.2000000005":1,"323456789.1000000005":1}
+
+-- !agg_window_topn_weighted --
+1      [523456789, 423456789, 323456789]
+1      [523456789, 423456789, 323456789]
+1      [523456789, 423456789, 323456789]
+1      [523456789, 423456789, 323456789]
+1      [523456789, 423456789, 323456789]
+1      [523456789, 423456789, 323456789]
+1      [523456789, 423456789, 323456789]
+2      [423456789, 123456789, 223456789]
+2      [423456789, 123456789, 223456789]
+2      [423456789, 123456789, 223456789]
+2      [423456789, 123456789, 223456789]
+2      [423456789, 123456789, 223456789]
+3      [423456789.2, 323456789.1, 223456789.6]
+3      [423456789.2, 323456789.1, 223456789.6]
+3      [423456789.2, 323456789.1, 223456789.6]
+3      [423456789.2, 323456789.1, 223456789.6]
+3      [423456789.2, 323456789.1, 223456789.6]
+
+-- !agg_window_topn_array --
+1      [523456789.0000000005, 423456789.0000000005, 323456789.0000000002]
+1      [523456789.0000000005, 423456789.0000000005, 323456789.0000000002]
+1      [523456789.0000000005, 423456789.0000000005, 323456789.0000000002]
+1      [523456789.0000000005, 423456789.0000000005, 323456789.0000000002]
+1      [523456789.0000000005, 423456789.0000000005, 323456789.0000000002]
+1      [523456789.0000000005, 423456789.0000000005, 323456789.0000000002]
+1      [523456789.0000000005, 423456789.0000000005, 323456789.0000000002]
+2      [423456789.0000000005, 323456789.0000000005, 223456789.0000000005]
+2      [423456789.0000000005, 323456789.0000000005, 223456789.0000000005]
+2      [423456789.0000000005, 323456789.0000000005, 223456789.0000000005]
+2      [423456789.0000000005, 323456789.0000000005, 223456789.0000000005]
+2      [423456789.0000000005, 323456789.0000000005, 223456789.0000000005]
+3      [223456789.6000000005, 423456789.2000000005, 323456789.1000000005]
+3      [223456789.6000000005, 423456789.2000000005, 323456789.1000000005]
+3      [223456789.6000000005, 423456789.2000000005, 323456789.1000000005]
+3      [223456789.6000000005, 423456789.2000000005, 323456789.1000000005]
+3      [223456789.6000000005, 423456789.2000000005, 323456789.1000000005]
+
+-- !agg_window_multi_distinct_count --
+1      5
+1      5
+1      5
+1      5
+1      5
+1      5
+1      5
+2      5
+2      5
+2      5
+2      5
+2      5
+3      4
+3      4
+3      4
+3      4
+3      4
+
+-- !agg_window_multi_distinct_sum --
+1      11320987615.0000000119
+1      1617283945.0000000017
+1      3234567890.0000000034
+1      4851851835.0000000051
+1      6469135780.0000000068
+1      8086419725.0000000085
+1      9703703670.0000000102
+2      1217283945.0000000026
+2      2434567890.0000000052
+2      3651851835.0000000078
+2      4869135780.0000000104
+2      6086419725.0000000130
+3      1093827157.0000000020
+3      2187654314.0000000040
+3      3281481471.0000000060
+3      4375308628.0000000080
+3      5469135785.0000000100
+
+-- !agg_window_bitmap_union --
+1      1,2,3
+1      1,2,3
+1      1,2,3
+1      1,2,3
+2      2,3,4
+2      2,3,4
+2      2,3,4
+3      3,4,5,6
+3      3,4,5,6
+3      3,4,5,6
+3      3,4,5,6
+
+-- !agg_window_bitmap_intersect --
+1      1
+1      1
+1      1
+1      1
+2      2
+2      2
+2      2
+3      
+3      
+3      
+3      
+
+-- !agg_window_group_bitmap_xor --
+1      1,3
+1      1,3
+1      1,3
+1      1,3
+2      2,4
+2      2,4
+2      2,4
+3      3,4,5,6
+3      3,4,5,6
+3      3,4,5,6
+3      3,4,5,6
+
+-- !agg_window_bitmap_union_count --
+1      3
+1      3
+1      3
+1      3
+2      3
+2      3
+2      3
+3      4
+3      4
+3      4
+3      4
+
+-- !agg_window_collect_list --
+1      ["1,2", "1,2", "1,3"]
+1      ["1,2", "1,2"]
+1      ["1,2", "1,2"]
+1      []
+2      ["2,3", "2,3", "2,4"]
+2      ["2,3", "2,3"]
+2      ["2,3", "2,3"]
+3      ["3", "4", "5", "6"]
+3      ["3", "4", "5"]
+3      ["3", "4"]
+3      ["3"]
+
+-- !agg_window_collect_set --
+1      ["1,2"]
+1      ["1,2"]
+1      ["1,3", "1,2"]
+1      []
+2      ["2,3", "2,4"]
+2      ["2,3"]
+2      ["2,3"]
+3      ["3", "4"]
+3      ["3"]
+3      ["5", "3", "4"]
+3      ["5", "3", "6", "4"]
+
+-- !agg_window_array_agg --
+1      [null, "1,2", "1,2", "1,3"]
+1      [null, "1,2", "1,2"]
+1      [null, "1,2", "1,2"]
+1      [null]
+2      ["2,3", "2,3", "2,4"]
+2      ["2,3", "2,3"]
+2      ["2,3", "2,3"]
+3      ["3", "4", "5", "6"]
+3      ["3", "4", "5"]
+3      ["3", "4"]
+3      ["3"]
+
+-- !agg_window_group_concat --
+1      \N
+1      1,2,1,2
+1      1,2,1,2
+1      1,2,1,2,1,3
+2      2,3,2,3
+2      2,3,2,3
+2      2,3,2,3,2,4
+3      3
+3      3,4
+3      3,4,5
+3      3,4,5,6
+
+-- !agg_window_sum0 --
+1      12
+1      12
+1      12
+1      12
+2      16
+2      16
+2      16
+3      25
+3      25
+3      25
+3      25
+
+-- !agg_window_group_array_intersect --
+1      []
+1      []
+1      []
+1      []
+2      ["2"]
+2      ["2"]
+2      ["2"]
+3      ["3", "4"]
+3      ["3", "4"]
+3      ["3", "4"]
+3      ["3", "4"]
+
+-- !window_func_hll_union_agg --
+beijing        linux   3
+beijing        macos   3
+beijing        windows 3
+hebei  windows 1
+jiangsu        macos   1
+shanghai       linux   2
+shanghai       windows 2
+shanxi windows 1
+shanxi windows 1
+
+-- !window_func_hll_union --
+beijing        linux   3
+beijing        macos   3
+beijing        windows 3
+hebei  windows 1
+jiangsu        macos   1
+shanghai       linux   2
+shanghai       windows 2
+shanxi windows 1
+shanxi windows 1
+
+-- !map_agg --
+1      {"LA":"V1_1", "LB":"V1_2", "LC":"V1_3"}
+1      {"LA":"V1_1", "LB":"V1_2", "LC":"V1_3"}
+1      {"LA":"V1_1", "LB":"V1_2", "LC":"V1_3"}
+2      {"LA":"V2_1", "LB":"V2_2", "LC":"V2_3"}
+2      {"LA":"V2_1", "LB":"V2_2", "LC":"V2_3"}
+2      {"LA":"V2_1", "LB":"V2_2", "LC":"V2_3"}
+3      {"LA":"V3_1", "LB":"V3_2", "LC":"V3_3"}
+3      {"LA":"V3_1", "LB":"V3_2", "LC":"V3_3"}
+3      {"LA":"V3_1", "LB":"V3_2", "LC":"V3_3"}
+4      {"LA":"V4_1", "LB":"V4_2", "LC":"V4_3"}
+4      {"LA":"V4_1", "LB":"V4_2", "LC":"V4_3"}
+4      {"LA":"V4_1", "LB":"V4_2", "LC":"V4_3"}
+5      {"LA":"V5_1", "LB":"V5_2", "LC":"V5_3"}
+5      {"LA":"V5_1", "LB":"V5_2", "LC":"V5_3"}
+5      {"LA":"V5_1", "LB":"V5_2", "LC":"V5_3"}
+
+-- !agg_window_quantile_union --
+20220201       0       1.0
+20220201       1       1.0
+
+-- !agg_window_retention_0 --
+1      [1, 1]
+2      [1, 0]
+3      [0, 0]
+4      [0, 0]
+5      [1, 1]
+
+-- !agg_window_retention_1 --
+1      [1, 1]
+1      [1, 1]
+2      [1, 0]
+2      [1, 0]
+3      [0, 0]
+3      [0, 0]
+4      [0, 0]
+5      [1, 1]
+5      [1, 1]
+5      [1, 1]
+
+-- !agg_window_sequence_match --
+1      true
+1      true
+1      true
+1      true
+1      true
+1      true
+1      true
+1      true
+2      false
+2      false
+2      false
+2      false
+2      false
+
+-- !agg_window_sequence_count --
+1      2
+1      2
+1      2
+1      2
+1      2
+1      2
+1      2
+1      2
+2      0
+2      0
+2      0
+2      0
+2      0
+
+-- !agg_window_sum_foreach --
+1      [1, 2, 3]
+2      [20]
+3      [100]
+4      \N
+5      [null, 2]
+
+-- !agg_window_sum_foreach2 --
+1      \N
+2      [1, 2, 3]
+3      [21, 2, 3]
+4      [120]
+5      [100]
+
+-- !agg_window_covar_foreach --
+1      [0, 0, 0]
+2      [0]
+3      [0]
+4      \N
+5      [null, 0]
+
+-- !agg_window_group_concat_state1 --
+1      string1,string1,string2,string2
+1      string1,string1,string2,string2
+1      string1,string1,string2,string2
+1      string1,string1,string2,string2
+2      string3,string3
+2      string3,string3
+
+-- !agg_window_group_concat_state_merge --
+1      string1,string1,string2,string2
+1      string1,string1,string2,string2
+1      string1,string1,string2,string2
+1      string1,string1,string2,string2
+2      string3,string3
+2      string3,string3
+
+-- !agg_window_orthogonal_bitmap1 --
+1      1,2
+1      1,2
+1      1,2
+2      2,3
+2      2,3
+2      2,3
+
+-- !agg_window_orthogonal_bitmap2 --
+1      2
+1      2
+1      2
+2      2
+2      2
+2      2
+
+-- !agg_window_orthogonal_bitmap3 --
+1      4
+1      4
+1      4
+2      5
+2      5
+2      5
+
+-- !agg_window_window_funnel --
+100123 2
+100123 2
+100123 2
+100123 2
+100123 2
+100125 3
+100125 3
+100125 3
+100126 2
+100126 2
+100127 2
+100127 2
+
diff --git 
a/regression-test/suites/nereids_p0/sql_functions/aggregate_functions/test_aggregate_window_functions.groovy
 
b/regression-test/suites/nereids_p0/sql_functions/aggregate_functions/test_aggregate_window_functions.groovy
new file mode 100644
index 00000000000..d644322730b
--- /dev/null
+++ 
b/regression-test/suites/nereids_p0/sql_functions/aggregate_functions/test_aggregate_window_functions.groovy
@@ -0,0 +1,523 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+suite("test_aggregate_window_functions") {
+    sql "SET enable_nereids_planner=true"
+    sql "SET enable_fallback_to_original_planner=false"
+
+    // approx_count_distinct 
+    sql """
+        drop table if exists test_aggregate_window_functions;
+    """
+    sql """
+        create table test_aggregate_window_functions (
+            id bigint,
+            name varchar(20),
+            province varchar(20)
+        ) distributed by hash(id) properties('replication_num' = '1');
+    """
+    sql """
+        insert into test_aggregate_window_functions values
+            (1, 'zhangsan', "sichuan"),
+            (4, 'zhangsan', "sichuan"),
+            (11, 'zhuge', "sichuan"),
+            (13, null, "sichuan"),
+            (2, 'lisi', "chongqing"),
+            (5, 'lisi2', "chongqing"),
+            (3, 'wangwu', "hubei"),
+            (6, 'wangwu2', "hubei"),
+            (12, "quyuan", 'hubei'),
+            (7, 'liuxiang', "beijing"),
+            (8, 'wangmang', "beijing"),
+            (9, 'liuxiang2', "beijing"),
+            (10, 'wangmang', "beijing");
+    """
+    order_qt_agg_window_approx_count_distinct "select province, 
approx_count_distinct(name) over(partition by province) from 
test_aggregate_window_functions;"
+
+    // count_by_enum
+    order_qt_agg_window_count_by_enum "select province, count_by_enum(name) 
over(partition by province order by name) from test_aggregate_window_functions;"
+
+    // avg_weighted
+    sql """
+        drop table if exists test_aggregate_window_functions;
+    """
+    sql """
+        create table test_aggregate_window_functions (
+            id bigint,
+            price decimalv3(38, 10),
+            count bigint
+        ) distributed by hash(id) properties('replication_num' = '1');
+    """
+    sql """
+        insert into test_aggregate_window_functions values
+            (1, 123456789.0000000001, 100),
+            (1, 223456789.0000000004, 200),
+            (1, 323456789.0000000002, 200),
+            (1, 423456789.0000000005, 300),
+            (1, 523456789.0000000005, null),
+            (1, 523456789.0000000005, 1000),
+            (1, 523456789.0000000005, 2000),
+            (2, 123456789.0000000005, 400),
+            (2, 123456789.0000000006, 500),
+            (2, 223456789.0000000005, 300),
+            (2, 323456789.0000000005, 100),
+            (2, 423456789.0000000005, 1000),
+            (3, 123456789.1000000005, 200),
+            (3, 223456789.6000000005, 1000),
+            (3, 223456789.6000000005, null),
+            (3, 323456789.1000000005, 2000),
+            (3, 423456789.2000000005, 3000);
+    """
+    order_qt_agg_window_avg_weighted "select id, avg_weighted(price, count) 
over(partition by id) from test_aggregate_window_functions;"
+
+    // corr
+    order_qt_agg_window_corr "select id, corr(price, count) over(partition by 
id) from test_aggregate_window_functions;"
+    // covar_samp
+    order_qt_agg_window_covar_samp "select id, covar_samp(price, count) 
over(partition by id) from test_aggregate_window_functions;"
+    // covar_pop
+    order_qt_agg_window_covar_pop "select id, covar_pop(price, count) 
over(partition by id) from test_aggregate_window_functions;"
+
+    // variance_pop
+    order_qt_agg_window_variance_pop "select id, variance_pop(price) 
over(partition by id) from test_aggregate_window_functions;"
+    // stddev_pop
+    order_qt_agg_window_stddev_pop "select id, stddev_pop(price) 
over(partition by id) from test_aggregate_window_functions;"
+
+    // variance_samp
+    order_qt_agg_window_variance_samp "select id, variance_samp(price) 
over(partition by id) from test_aggregate_window_functions;"
+    // stddev_samp
+    order_qt_agg_window_stddev_samp "select id, stddev_samp(price) 
over(partition by id) from test_aggregate_window_functions;"
+
+    // group_bit_or
+    order_qt_agg_window_group_bit_or "select id, group_bit_or(count) 
over(partition by id) from test_aggregate_window_functions;"
+    // group_bit_and
+    order_qt_agg_window_group_bit_and "select id, group_bit_and(count) 
over(partition by id) from test_aggregate_window_functions;"
+    // group_bit_xor
+    order_qt_agg_window_group_bit_xor "select id, group_bit_xor(count) 
over(partition by id) from test_aggregate_window_functions;"
+
+    // bitmap_agg
+    order_qt_agg_window_bitmap_agg "select id, 
bitmap_to_string(bitmap_agg(count) over(partition by id)) from 
test_aggregate_window_functions;"
+
+    // BITMAP_UNION_INT
+    order_qt_agg_window_bitmap_union_int "select id, bitmap_union_int(count) 
over(partition by id) from test_aggregate_window_functions;"
+
+    // histogram
+    order_qt_agg_window_histogram "select id, histogram(count) over(partition 
by id) from test_aggregate_window_functions;"
+
+    // max_by
+    order_qt_agg_window_max_by "select id, count, max_by(price, count) 
over(partition by id order by count) from test_aggregate_window_functions;"
+    // min_by
+    order_qt_agg_window_min_by "select id, count, min_by(price, count) 
over(partition by id order by count) from test_aggregate_window_functions;"
+    // any_value
+    order_qt_agg_window_any_value "select id, any_value(price) over(partition 
by id order by price) from test_aggregate_window_functions;"
+
+    // percentile
+    order_qt_agg_window_percentile "select id, percentile(price, 0.95) 
over(partition by id) from test_aggregate_window_functions;"
+    // percentile_array
+    order_qt_agg_window_percentile_array "select id, percentile_array(price, 
array(0.25, 0.5, 0.75)) over(partition by id) from 
test_aggregate_window_functions;"
+    // percentile_approx
+    order_qt_agg_window_percentile_approx "select id, percentile_approx(price, 
0.95) over(partition by id) from test_aggregate_window_functions;"
+    // percentile_approx_weighted
+    // error: Can not found function 'percentile_approx_weighted'
+    // order_qt_agg_window_percentile_approx_weighted "select id, 
percentile_approx_weighted(price, count, 0.95) over(partition by id) from 
test_aggregate_window_functions;"
+
+    // topn
+    order_qt_agg_window_topn "select id, topn(price, 3) over(partition by id) 
from test_aggregate_window_functions;"    
+    // topn_weighted
+    order_qt_agg_window_topn_weighted "select id, topn_weighted(price, count, 
3) over(partition by id) from test_aggregate_window_functions;"
+    // topn_array
+    order_qt_agg_window_topn_array "select id, topn_array(price, 3) 
over(partition by id) from test_aggregate_window_functions;"
+
+    // multi_distinct_count
+    order_qt_agg_window_multi_distinct_count "select id, 
multi_distinct_count(price) over(partition by id) from 
test_aggregate_window_functions;"
+
+    // multi_distinct_count_distribute_key, FE not implemented yet
+    // order_qt_agg_window_multi_distinct_count_distribute_key "select id, 
multi_distinct_distribute_key(id) over(partition by id) from 
test_aggregate_window_functions;"
+    // order_qt_agg_window_multi_distinct_count_distribute_key "select id, 
multi_distinct_count_distribute_key(price) over(partition by id) from 
test_aggregate_window_functions;"
+
+    // multi_distinct_sum
+    order_qt_agg_window_multi_distinct_sum "select id, 
multi_distinct_sum(price) over(partition by id) from 
test_aggregate_window_functions;"
+
+    sql """
+        drop table if exists test_aggregate_window_functions;
+    """
+    sql """
+        create table test_aggregate_window_functions (
+            id bigint,
+            id2 bigint,
+            user_ids varchar(64)
+        ) distributed by hash(id) properties('replication_num' = '1');
+    """
+    sql """
+        insert into test_aggregate_window_functions values
+            (1, 1, '1,2'),
+            (1, 3, '1,2'),
+            (1, 2, '1,3'),
+            (1, 6, null),
+            (2, 2, '2,3'),
+            (2, 5, '2,3'),
+            (2, 9, '2,4'),
+            (3, 10, '3'),
+            (3, 1, '4'),
+            (3, 5, '5'),
+            (3, 9, '6');
+    """
+    // bitmap_union
+    order_qt_agg_window_bitmap_union "select id, 
bitmap_to_string(bitmap_union(bitmap_from_string(user_ids)) over(partition by 
id)) from test_aggregate_window_functions;"
+    // bitmap_intersect
+    order_qt_agg_window_bitmap_intersect "select id, 
bitmap_to_string(bitmap_intersect(bitmap_from_string(user_ids)) over(partition 
by id)) from test_aggregate_window_functions;"
+    // group_bitmap_xor
+    order_qt_agg_window_group_bitmap_xor "select id, 
bitmap_to_string(group_bitmap_xor(bitmap_from_string(user_ids)) over(partition 
by id)) from test_aggregate_window_functions;"
+    // bitmap_union_count
+    order_qt_agg_window_bitmap_union_count "select id, 
bitmap_union_count(bitmap_from_string(user_ids)) over(partition by id) from 
test_aggregate_window_functions;"
+
+    // collect_list
+    order_qt_agg_window_collect_list "select id, collect_list(user_ids) 
over(partition by id order by user_ids) from test_aggregate_window_functions;"
+    // collect_set
+    order_qt_agg_window_collect_set "select id, collect_set(user_ids) 
over(partition by id order by user_ids) from test_aggregate_window_functions;"
+    // array_agg
+    order_qt_agg_window_array_agg "select id, array_agg(user_ids) 
over(partition by id order by user_ids) from test_aggregate_window_functions;"
+
+    // group_concat
+    order_qt_agg_window_group_concat "select id, group_concat(user_ids) 
over(partition by id order by user_ids) from test_aggregate_window_functions;"
+    // group_concat distinct
+    // DISTINCT not allowed in analytic function: group_concat(line 1, pos 11)
+    // order_qt_agg_window_group_concat_distinct "select id, 
group_concat(distinct user_ids) over(partition by id) from 
test_aggregate_window_functions;"
+    // group_concat order by
+    // java.sql.SQLException: errCode = 2, detailMessage = Cannot invoke 
"org.apache.doris.analysis.Expr.getChildren()" because "root" is null
+    // order_qt_agg_window_group_concat_order_by "select id, 
group_concat(user_ids order by id2) over(partition by id) from 
test_aggregate_window_functions;"
+    // sum0
+    order_qt_agg_window_sum0 "select id, sum0(id2) over(partition by id) from 
test_aggregate_window_functions;"
+
+    // group_array_intersect
+    sql """
+        drop table if exists test_aggregate_window_functions;
+    """
+    sql """
+        create table test_aggregate_window_functions (
+            id bigint,
+            user_ids array<varchar(64)>
+        ) distributed by hash(id) properties('replication_num' = '1');
+    """
+    sql """
+        insert into test_aggregate_window_functions values
+            (1, [1,2]),
+            (1, [1,2]),
+            (1, [1,3]),
+            (1, null),
+            (2, [2,3]),
+            (2, [2,3]),
+            (2, [2,4]),
+            (3, [3,4]),
+            (3, [4,3,null]),
+            (3, [5,3,4]),
+            (3, [3,6,4]);
+    """
+    order_qt_agg_window_group_array_intersect "select id, 
array_sort(group_array_intersect(user_ids) over(partition by id)) from 
test_aggregate_window_functions;"
+
+    // hll_union_agg
+    sql """drop TABLE if EXISTS test_window_func_hll;"""
+    sql """
+            create table test_window_func_hll(
+                dt date,
+                id int,
+                name char(10),
+                province char(10),
+                os char(10),
+                pv hll hll_union
+            )
+            Aggregate KEY (dt,id,name,province,os)
+            distributed by hash(id) buckets 10
+            PROPERTIES (
+            "replication_allocation" = "tag.location.default: 1",
+            "storage_format" = "V2"
+            )
+        """
+    sql """
+            insert into test_window_func_hll
+            SELECT
+               dt,id,name,province,os,pv
+            from (
+               SELECT   '2022-05-05' as dt,'10001' as id,'test01' as 
name,'beijing' as province,'windows' as os,hll_hash('windows') as pv
+               union all
+               SELECT   '2022-05-05' as dt,'10002' as id,'test01' as 
name,'beijing' as province,'linux' as os,hll_hash('linux') as pv
+               union all
+               SELECT   '2022-05-05' as dt,'10003' as id,'test01' as 
name,'beijing' as province,'macos' as os,hll_hash('macos') as pv
+               union all
+               SELECT   '2022-05-05' as dt,'10004' as id,'test01' as 
name,'hebei' as province,'windows' as os,hll_hash('windows') as pv
+               union all
+               SELECT   '2022-05-06' as dt,'10001' as id,'test01' as 
name,'shanghai' as province,'windows' as os,hll_hash('windows') as pv
+               union all
+               SELECT   '2022-05-06' as dt,'10002' as id,'test01' as 
name,'shanghai' as province,'linux' as os,hll_hash('linux') as pv
+               union all
+               SELECT   '2022-05-06' as dt,'10003' as id,'test01' as 
name,'jiangsu' as province,'macos' as os,hll_hash('macos') as pv
+               union all
+               SELECT   '2022-05-06' as dt,'10004' as id,'test01' as 
name,'shanxi' as province,'windows' as os,hll_hash('windows') as pv
+               union all
+               SELECT   '2022-05-07' as dt,'10005' as id,'test01' as 
name,'shanxi' as province,'windows' as os,hll_empty() as pv
+            ) as a
+        """
+    order_qt_window_func_hll_union_agg "select province, os, hll_union_agg(pv) 
over(partition by province) from test_window_func_hll;"
+    order_qt_window_func_hll_union "select province, os, 
hll_cardinality(hll_union(pv) over(partition by province)) from 
test_window_func_hll;"
+
+    // map_agg
+    sql "DROP TABLE IF EXISTS `test_map_agg`;"
+    sql """
+        CREATE TABLE IF NOT EXISTS `test_map_agg` (
+            `id` int(11) NOT NULL,
+            `label_name` varchar(32) NOT NULL,
+            `value_field` string
+        )
+        DISTRIBUTED BY HASH(`id`)
+        PROPERTIES (
+        "replication_num" = "1"
+        );
+     """
+
+    sql """
+        insert into `test_map_agg` values
+            (1, "LA", "V1_1"),
+            (1, "LB", "V1_2"),
+            (1, "LC", "V1_3"),
+            (2, "LA", "V2_1"),
+            (2, "LB", "V2_2"),
+            (2, "LC", "V2_3"),
+            (3, "LA", "V3_1"),
+            (3, "LB", "V3_2"),
+            (3, "LC", "V3_3"),
+            (4, "LA", "V4_1"),
+            (4, "LB", "V4_2"),
+            (4, "LC", "V4_3"),
+            (5, "LA", "V5_1"),
+            (5, "LB", "V5_2"),
+            (5, "LC", "V5_3");
+    """
+    order_qt_map_agg "select id, map_agg(label_name, value_field) 
over(partition by id) from test_map_agg;"
+
+    // quantile_state
+    sql """
+        drop table if exists test_aggregate_window_functions;
+    """
+    sql """
+        CREATE TABLE test_aggregate_window_functions (
+            `dt` int(11) NULL COMMENT "",
+            `id` int(11) NULL COMMENT "",
+            `price` quantile_state QUANTILE_UNION NOT NULL COMMENT ""
+           ) ENGINE=OLAP
+           AGGREGATE KEY(`dt`, `id`)
+           DISTRIBUTED BY HASH(`dt`)
+           PROPERTIES (
+                  "replication_num" = "1"
+            );
+        """
+    sql """INSERT INTO test_aggregate_window_functions values(20220201,0, 
to_quantile_state(1, 2048))"""
+    sql """INSERT INTO test_aggregate_window_functions values(20220201,1, 
to_quantile_state(-1, 2048)),
+            (20220201,1, to_quantile_state(0, 2048)),(20220201,1, 
to_quantile_state(1, 2048)),
+            (20220201,1, to_quantile_state(2, 2048)),(20220201,1, 
to_quantile_state(3, 2048))
+        """
+
+    // quantile_union
+    order_qt_agg_window_quantile_union """select dt, id, 
quantile_percent(quantile_union(price), 0.5) from 
test_aggregate_window_functions group by dt, id;"""
+
+    // retention
+    sql """
+        drop table if exists test_aggregate_window_functions;
+    """
+    sql """
+        CREATE TABLE test_aggregate_window_functions(
+            id TINYINT,
+            action STRING,
+            time DATETIME
+        ) DUPLICATE KEY(id)
+        DISTRIBUTED BY HASH(id)
+        PROPERTIES (
+                 "replication_num" = "1"
+           );
+    """
+
+    sql """
+        INSERT INTO test_aggregate_window_functions VALUES 
+        (1,'pv','2022-01-01 08:00:05'),
+        (2,'pv','2022-01-01 10:20:08'),
+        (1,'buy','2022-01-02 15:30:10'),
+        (2,'pv','2022-01-02 17:30:05'),
+        (3,'buy','2022-01-01 05:30:09'),
+        (3,'buy','2022-01-02 08:10:15'),
+        (4,'pv','2022-01-02 21:09:15'),
+        (5,'pv','2022-01-01 22:10:53'),
+        (5,'pv','2022-01-02 19:10:52'),
+        (5,'buy','2022-01-02 20:00:50');
+        """
+    order_qt_agg_window_retention_0 """
+        select id, retention(action='pv' and to_date(time)='2022-01-01',
+                              action='buy' and to_date(time)='2022-01-02') as 
retention 
+        from test_aggregate_window_functions
+        group by id;"""
+    order_qt_agg_window_retention_1 """
+        select id, retention(action='pv' and to_date(time)='2022-01-01',
+                              action='buy' and to_date(time)='2022-01-02') 
over (partition by id) as retention 
+        from test_aggregate_window_functions;"""
+
+    // sequence_match and sequence_count
+    sql """
+        drop table if exists test_aggregate_window_functions;
+    """
+    sql """
+        CREATE TABLE test_aggregate_window_functions(
+            `uid` int,
+            `date` datetime, 
+            `number` int
+        ) DISTRIBUTED BY HASH(uid)
+        PROPERTIES (
+                 "replication_num" = "1"
+           );
+    """
+    sql """
+        INSERT INTO test_aggregate_window_functions values
+            (1, '2022-11-01 10:41:00', 1),
+            (1, '2022-11-01 11:41:00', 5),
+            (1, '2022-11-01 12:41:00', 7),
+            (1, '2022-11-01 12:42:00', 9),
+            (1, '2022-11-01 12:52:00', 1),
+            (1, '2022-11-01 13:41:00', 4),
+            (1, '2022-11-01 13:51:00', 3),
+            (1, '2022-11-01 14:51:00', 5),
+            (2, '2022-11-01 20:41:00', 1),
+            (2, '2022-11-01 23:51:00', 3),
+            (2, '2022-11-01 22:41:00', 7),
+            (2, '2022-11-01 22:42:00', 9),
+            (2, '2022-11-01 23:41:00', 4);
+    """
+    order_qt_agg_window_sequence_match "select uid, sequence_match('(?1)(?2)', 
date, number = 1, number = 5) over(partition by uid) from 
test_aggregate_window_functions;"
+    order_qt_agg_window_sequence_count "select uid, sequence_count('(?1)(?2)', 
date, number = 1, number = 5) over(partition by uid) from 
test_aggregate_window_functions;"
+
+    sql """
+        drop table if exists test_aggregate_window_functions;
+    """
+    sql """
+       CREATE TABLE test_aggregate_window_functions(
+              `id` INT(11) null COMMENT "",
+              `a` array<INT> null  COMMENT "",
+              `b` array<array<INT>>  null COMMENT "",
+              `s` array<String>  null  COMMENT ""
+            ) ENGINE=OLAP
+            DUPLICATE KEY(`id`)
+            DISTRIBUTED BY HASH(`id`) BUCKETS 1
+            PROPERTIES (
+            "replication_allocation" = "tag.location.default: 1",
+            "storage_format" = "V2"
+    );
+    """
+    sql """
+    insert into test_aggregate_window_functions values
+    (1,[1,2,3],[[1],[1,2,3],[2]],["ab","123","114514"]),
+    (2,[20],[[2]],["cd"]),
+    (3,[100],[[1]],["efg"]) , 
+    (4,null,[null],null),
+    (5,[null,2],[[2],null],[null,'c']);
+   """
+    // sum_foreach
+    order_qt_agg_window_sum_foreach "select id, sum_foreach(a) over(partition 
by id) from test_aggregate_window_functions;"
+    order_qt_agg_window_sum_foreach2 "select id, sum_foreach(a) over(order by 
id rows between 2 preceding and 1 preceding) from 
test_aggregate_window_functions;"
+    // covar_foreach
+    order_qt_agg_window_covar_foreach "select id, covar_foreach(a, a) 
over(partition by id) from test_aggregate_window_functions;"
+
+    sql "drop table if exists test_aggregate_window_functions"
+
+    sql """
+        CREATE TABLE IF NOT EXISTS `test_aggregate_window_functions` (
+            `kint` int(11) not null,
+            `kbint` int(11) not null,
+            `kstr` string not null,
+            `kstr2` string not null,
+            `kastr` array<string> not null
+        ) engine=olap
+        DISTRIBUTED BY HASH(`kint`) BUCKETS 4
+        properties("replication_num" = "1");
+    """
+
+    sql """
+        INSERT INTO `test_aggregate_window_functions` VALUES 
+        ( 1, 1, 'string1', 'string3', ['s11', 's12', 's13'] ),
+        ( 1, 2, 'string2', 'string1', ['s21', 's22', 's23'] ),
+        ( 2, 3, 'string3', 'string2', ['s31', 's32', 's33'] ),
+        ( 1, 1, 'string1', 'string3', ['s11', 's12', 's13'] ),
+        ( 1, 2, 'string2', 'string1', ['s21', 's22', 's23'] ),
+        ( 2, 3, 'string3', 'string2', ['s31', 's32', 's33'] );
+    """
+
+    order_qt_agg_window_group_concat_state1 "select kint, group_concat(kstr) 
over(partition by kint) from test_aggregate_window_functions;"
+    sql "select kint, group_concat_union(group_concat_state(kstr)) 
over(partition by kint) from test_aggregate_window_functions;"
+    order_qt_agg_window_group_concat_state_merge "select kint, 
group_concat_merge(group_concat_state(kstr)) over(partition by kint) from 
test_aggregate_window_functions;"
+
+    sql """
+        drop table if exists test_aggregate_window_functions;
+    """
+    sql """ CREATE TABLE IF NOT EXISTS test_aggregate_window_functions (
+        tag_group bigint(20) NULL COMMENT "标签组",
+        bucket int(11) NOT NULL COMMENT "分桶字段",
+        members bitmap BITMAP_UNION  COMMENT "人群") ENGINE=OLAP
+        AGGREGATE KEY(tag_group, bucket)
+        DISTRIBUTED BY HASH(bucket) BUCKETS 64
+        PROPERTIES (
+            "replication_allocation" = "tag.location.default: 1");
+    """
+    sql """
+        insert into test_aggregate_window_functions values
+        (1, 1, bitmap_from_string('1,2,3,4')),
+        (2, 1, bitmap_from_string('1,2,3')),
+        (3, 1, bitmap_from_string('1,2')),
+        (1, 2, bitmap_from_string('2,3,4,5,6')),
+        (2, 2, bitmap_from_string('2,3,4')),
+        (3, 2, bitmap_from_string('2,3'));
+    """
+    order_qt_agg_window_orthogonal_bitmap1 "select bucket, 
bitmap_to_string(orthogonal_bitmap_intersect(members, tag_group, 1, 2, 3) 
over(partition by bucket)) from test_aggregate_window_functions;"
+    order_qt_agg_window_orthogonal_bitmap2 "select bucket, 
orthogonal_bitmap_intersect_count(members, tag_group, 1, 2, 3) over(partition 
by bucket) from test_aggregate_window_functions;"
+    order_qt_agg_window_orthogonal_bitmap3 "select bucket, 
orthogonal_bitmap_union_count(members) over(partition by bucket) from 
test_aggregate_window_functions;"
+
+    // window_funnel
+    sql """
+        drop table if exists test_aggregate_window_functions;
+    """
+    sql """
+        CREATE TABLE test_aggregate_window_functions(
+            user_id BIGINT,
+            event_name VARCHAR(64),
+            event_timestamp datetime,
+            phone_brand varchar(64),
+            tab_num int
+        ) distributed by hash(event_timestamp) buckets 3 
properties("replication_num"="1");
+    """
+    sql """
+        INSERT INTO test_aggregate_window_functions VALUES
+            (100123, '登录', '2022-05-14 10:01:00', 'HONOR', 1),
+            (100123, '访问', '2022-05-14 10:02:00', 'HONOR', 2),
+            (100123, '登录2', '2022-05-14 10:03:00', 'HONOR', 3),
+            (100123, '下单', '2022-05-14 10:04:00', "HONOR", 4),
+            (100123, '付款', '2022-05-14 10:10:00', 'HONOR', 4),
+            (100125, '登录', '2022-05-15 11:00:00', 'XIAOMI', 1),
+            (100125, '访问', '2022-05-15 11:01:00', 'XIAOMI', 2),
+            (100125, '下单', '2022-05-15 11:02:00', 'XIAOMI', 6),
+            (100126, '登录', '2022-05-15 12:00:00', 'IPHONE', 1),
+            (100126, '访问', '2022-05-15 12:01:00', 'HONOR', 2),
+            (100127, '登录', '2022-05-15 11:30:00', 'VIVO', 1),
+            (100127, '访问', '2022-05-15 11:31:00', 'VIVO', 5);
+    """
+    order_qt_agg_window_window_funnel """
+        select user_id, window_funnel(3600, "fixed", event_timestamp, 
event_name = '登录', event_name = '访问', event_name = '下单', event_name = '付款') 
over(partition by user_id) from test_aggregate_window_functions;
+    """
+
+}
\ No newline at end of file


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to