This is an automated email from the ASF dual-hosted git repository.
dataroaring pushed a commit to branch branch-3.0
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-3.0 by this push:
new 341d3cb9f80 branch-3.0: [fix](nereids)should distinguish hash and
other conjuncts for outer join in MultiJoin #53051 (#53090)
341d3cb9f80 is described below
commit 341d3cb9f80c593f1a7647b38f9c47a9a717bf3c
Author: github-actions[bot]
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Thu Jul 24 10:11:41 2025 +0800
branch-3.0: [fix](nereids)should distinguish hash and other conjuncts for
outer join in MultiJoin #53051 (#53090)
Cherry-picked from #53051
Co-authored-by: starocean999 <[email protected]>
---
.../doris/nereids/rules/rewrite/MultiJoin.java | 24 +-
.../doris/nereids/rules/rewrite/ReorderJoin.java | 17 +-
.../nereids_p0/join/test_many_multi_join.groovy | 906 +++++++++++++++++++++
3 files changed, 932 insertions(+), 15 deletions(-)
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/MultiJoin.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/MultiJoin.java
index 83e849086ab..bc6ea17d8a6 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/MultiJoin.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/MultiJoin.java
@@ -69,14 +69,16 @@ public class MultiJoin extends AbstractLogicalPlan
implements BlockFuncDepsPropa
// MultiJoin just contains one OUTER/SEMI/ANTI.
private final JoinType joinType;
// When contains one OUTER/SEMI/ANTI join, keep separately its condition.
- private final List<Expression> notInnerJoinConditions;
+ private final List<Expression> notInnerJoinHashConditions;
+ private final List<Expression> notInnerJoinOtherConditions;
public MultiJoin(List<Plan> inputs, List<Expression> joinFilter, JoinType
joinType,
- List<Expression> notInnerJoinConditions) {
+ List<Expression> notInnerJoinHashConditions, List<Expression>
notInnerJoinOtherConditions) {
super(PlanType.LOGICAL_MULTI_JOIN, inputs);
this.joinFilter = Objects.requireNonNull(joinFilter);
this.joinType = joinType;
- this.notInnerJoinConditions =
Objects.requireNonNull(notInnerJoinConditions);
+ this.notInnerJoinHashConditions =
Objects.requireNonNull(notInnerJoinHashConditions);
+ this.notInnerJoinOtherConditions =
Objects.requireNonNull(notInnerJoinOtherConditions);
}
public JoinType getJoinType() {
@@ -87,13 +89,17 @@ public class MultiJoin extends AbstractLogicalPlan
implements BlockFuncDepsPropa
return joinFilter;
}
- public List<Expression> getNotInnerJoinConditions() {
- return notInnerJoinConditions;
+ public List<Expression> getNotInnerHashJoinConditions() {
+ return notInnerJoinHashConditions;
+ }
+
+ public List<Expression> getNotInnerOtherJoinConditions() {
+ return notInnerJoinOtherConditions;
}
@Override
public MultiJoin withChildren(List<Plan> children) {
- return new MultiJoin(children, joinFilter, joinType,
notInnerJoinConditions);
+ return new MultiJoin(children, joinFilter, joinType,
notInnerJoinHashConditions, notInnerJoinOtherConditions);
}
@Override
@@ -160,7 +166,8 @@ public class MultiJoin extends AbstractLogicalPlan
implements BlockFuncDepsPropa
public List<? extends Expression> getExpressions() {
return new Builder<Expression>()
.addAll(joinFilter)
- .addAll(notInnerJoinConditions)
+ .addAll(notInnerJoinHashConditions)
+ .addAll(notInnerJoinOtherConditions)
.build();
}
@@ -180,7 +187,8 @@ public class MultiJoin extends AbstractLogicalPlan
implements BlockFuncDepsPropa
return Utils.toSqlString("MultiJoin",
"joinType", joinType,
"joinFilter", joinFilter,
- "notInnerJoinConditions", notInnerJoinConditions
+ "notInnerHashJoinConditions", notInnerJoinHashConditions,
+ "notInnerOtherJoinConditions", notInnerJoinOtherConditions
);
}
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/ReorderJoin.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/ReorderJoin.java
index e4af85b92c9..37765dd3623 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/ReorderJoin.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/ReorderJoin.java
@@ -111,7 +111,8 @@ public class ReorderJoin extends OneRewriteRuleFactory {
List<Plan> inputs = Lists.newArrayList();
List<Expression> joinFilter = Lists.newArrayList();
- List<Expression> notInnerJoinConditions = Lists.newArrayList();
+ List<Expression> notInnerHashJoinConditions = Lists.newArrayList();
+ List<Expression> notInnerOtherJoinConditions = Lists.newArrayList();
LogicalJoin<?, ?> join;
// Implicit rely on {rule: MergeFilters}, so don't exist
filter--filter--join.
@@ -127,8 +128,8 @@ public class ReorderJoin extends OneRewriteRuleFactory {
joinFilter.addAll(join.getHashJoinConjuncts());
joinFilter.addAll(join.getOtherJoinConjuncts());
} else {
- notInnerJoinConditions.addAll(join.getHashJoinConjuncts());
- notInnerJoinConditions.addAll(join.getOtherJoinConjuncts());
+ notInnerHashJoinConditions.addAll(join.getHashJoinConjuncts());
+ notInnerOtherJoinConditions.addAll(join.getOtherJoinConjuncts());
}
// recursively convert children.
@@ -161,7 +162,8 @@ public class ReorderJoin extends OneRewriteRuleFactory {
inputs,
joinFilter,
join.getJoinType(),
- notInnerJoinConditions);
+ notInnerHashJoinConditions,
+ notInnerOtherJoinConditions);
}
/**
@@ -253,7 +255,7 @@ public class ReorderJoin extends OneRewriteRuleFactory {
multiJoinHandleChildren.children().subList(0,
multiJoinHandleChildren.arity() - 1),
pushedFilter,
JoinType.INNER_JOIN,
- ExpressionUtils.EMPTY_CONDITION), planToHintType);
+ ExpressionUtils.EMPTY_CONDITION,
ExpressionUtils.EMPTY_CONDITION), planToHintType);
} else if (multiJoinHandleChildren.getJoinType().isRightJoin()) {
left = multiJoinHandleChildren.child(0);
Set<ExprId> leftOutputExprIdSet = left.getOutputExprIdSet();
@@ -267,7 +269,7 @@ public class ReorderJoin extends OneRewriteRuleFactory {
multiJoinHandleChildren.children().subList(1,
multiJoinHandleChildren.arity()),
pushedFilter,
JoinType.INNER_JOIN,
- ExpressionUtils.EMPTY_CONDITION), planToHintType);
+ ExpressionUtils.EMPTY_CONDITION,
ExpressionUtils.EMPTY_CONDITION), planToHintType);
} else {
remainingFilter = multiJoin.getJoinFilter();
Preconditions.checkState(multiJoinHandleChildren.arity() == 2);
@@ -284,7 +286,8 @@ public class ReorderJoin extends OneRewriteRuleFactory {
return
PlanUtils.filterOrSelf(ImmutableSet.copyOf(remainingFilter), new LogicalJoin<>(
multiJoinHandleChildren.getJoinType(),
- ExpressionUtils.EMPTY_CONDITION,
multiJoinHandleChildren.getNotInnerJoinConditions(),
+ multiJoinHandleChildren.getNotInnerHashJoinConditions(),
+ multiJoinHandleChildren.getNotInnerOtherJoinConditions(),
planToHintType.getOrDefault(right, new
DistributeHint(DistributeType.NONE)),
Optional.empty(),
left, right, null));
diff --git a/regression-test/suites/nereids_p0/join/test_many_multi_join.groovy
b/regression-test/suites/nereids_p0/join/test_many_multi_join.groovy
new file mode 100644
index 00000000000..b560cddbc3f
--- /dev/null
+++ b/regression-test/suites/nereids_p0/join/test_many_multi_join.groovy
@@ -0,0 +1,906 @@
+// 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_many_multi_join", "nereids_p0") {
+ def DBname = "nereids_regression_test_many_multi_join"
+ sql "DROP DATABASE IF EXISTS ${DBname}"
+ sql "CREATE DATABASE IF NOT EXISTS ${DBname}"
+ sql "use ${DBname}"
+
+ multi_sql """
+ drop table if exists table1;
+ drop table if exists table2;
+ drop table if exists table3;
+ drop table if exists table4;
+ drop table if exists table5;
+ drop table if exists table6;
+ drop table if exists table7;
+ drop table if exists table8;
+ drop table if exists table9;
+ drop table if exists table10;
+ drop table if exists table11;
+ drop table if exists table12;
+ drop table if exists table13;
+ drop table if exists table14;
+ drop table if exists table15;
+ drop table if exists table16;
+ drop table if exists table17;
+ drop table if exists table18;
+ drop table if exists table19;
+ drop table if exists table20;
+ drop table if exists table21;
+
+ drop table if exists seq;
+ CREATE TABLE seq (number INT) ENGINE=OLAP UNIQUE KEY(number)
+ DISTRIBUTED BY HASH(number) BUCKETS 1
+ PROPERTIES("replication_num" = "1");
+
+ INSERT INTO seq VALUES (1),(2),(3),(4),(5);
+
+
+ CREATE TABLE IF NOT EXISTS table1 (
+ id BIGINT NOT NULL,
+ value1 DECIMAL(20,6),
+ related_id BIGINT,
+ ts DATETIME
+ )
+ ENGINE=OLAP
+ DUPLICATE KEY(id)
+ DISTRIBUTED BY HASH(id) BUCKETS 16
+ PROPERTIES (
+ "replication_num" = "1"
+ );
+
+ CREATE TABLE IF NOT EXISTS table2 (
+ id BIGINT NOT NULL,
+ value2 DECIMAL(20,6),
+ related_id BIGINT,
+ ts DATETIME
+ )
+ ENGINE=OLAP
+ DUPLICATE KEY(id)
+ DISTRIBUTED BY HASH(id) BUCKETS 16
+ PROPERTIES (
+ "replication_num" = "1"
+ );
+
+ CREATE TABLE IF NOT EXISTS table3 (
+ id BIGINT NOT NULL,
+ value3 DECIMAL(20,6),
+ related_id BIGINT,
+ ts DATETIME
+ )
+ ENGINE=OLAP
+ DUPLICATE KEY(id)
+ DISTRIBUTED BY HASH(id) BUCKETS 16
+ PROPERTIES (
+ "replication_num" = "1"
+ );
+
+ CREATE TABLE IF NOT EXISTS table4 (
+ id BIGINT NOT NULL,
+ value4 DECIMAL(20,6),
+ related_id BIGINT,
+ ts DATETIME
+ )
+ ENGINE=OLAP
+ DUPLICATE KEY(id)
+ DISTRIBUTED BY HASH(id) BUCKETS 16
+ PROPERTIES (
+ "replication_num" = "1"
+ );
+
+ CREATE TABLE IF NOT EXISTS table5 (
+ id BIGINT NOT NULL,
+ value5 DECIMAL(20,6),
+ related_id BIGINT,
+ ts DATETIME
+ )
+ ENGINE=OLAP
+ DUPLICATE KEY(id)
+ DISTRIBUTED BY HASH(id) BUCKETS 16
+ PROPERTIES (
+ "replication_num" = "1"
+ );
+
+ CREATE TABLE IF NOT EXISTS table6 (
+ id BIGINT NOT NULL,
+ value6 DECIMAL(20,6),
+ related_id BIGINT,
+ ts DATETIME
+ )
+ ENGINE=OLAP
+ DUPLICATE KEY(id)
+ DISTRIBUTED BY HASH(id) BUCKETS 16
+ PROPERTIES (
+ "replication_num" = "1"
+ );
+
+ CREATE TABLE IF NOT EXISTS table7 (
+ id BIGINT NOT NULL,
+ value7 DECIMAL(20,6),
+ related_id BIGINT,
+ ts DATETIME
+ )
+ ENGINE=OLAP
+ DUPLICATE KEY(id)
+ DISTRIBUTED BY HASH(id) BUCKETS 16
+ PROPERTIES (
+ "replication_num" = "1"
+ );
+
+ CREATE TABLE IF NOT EXISTS table8 (
+ id BIGINT NOT NULL,
+ value8 DECIMAL(20,6),
+ related_id BIGINT,
+ ts DATETIME
+ )
+ ENGINE=OLAP
+ DUPLICATE KEY(id)
+ DISTRIBUTED BY HASH(id) BUCKETS 16
+ PROPERTIES (
+ "replication_num" = "1"
+ );
+
+ CREATE TABLE IF NOT EXISTS table9 (
+ id BIGINT NOT NULL,
+ value9 DECIMAL(20,6),
+ related_id BIGINT,
+ ts DATETIME
+ )
+ ENGINE=OLAP
+ DUPLICATE KEY(id)
+ DISTRIBUTED BY HASH(id) BUCKETS 16
+ PROPERTIES (
+ "replication_num" = "1"
+ );
+
+ CREATE TABLE IF NOT EXISTS table10 (
+ id BIGINT NOT NULL,
+ value10 DECIMAL(20,6),
+ related_id BIGINT,
+ ts DATETIME
+ )
+ ENGINE=OLAP
+ DUPLICATE KEY(id)
+ DISTRIBUTED BY HASH(id) BUCKETS 16
+ PROPERTIES (
+ "replication_num" = "1"
+ );
+
+ CREATE TABLE IF NOT EXISTS table11 (
+ id BIGINT NOT NULL,
+ value11 DECIMAL(20,6),
+ related_id BIGINT,
+ ts DATETIME
+ )
+ ENGINE=OLAP
+ DUPLICATE KEY(id)
+ DISTRIBUTED BY HASH(id) BUCKETS 16
+ PROPERTIES (
+ "replication_num" = "1"
+ );
+
+ CREATE TABLE IF NOT EXISTS table12 (
+ id BIGINT NOT NULL,
+ value12 DECIMAL(20,6),
+ related_id BIGINT,
+ ts DATETIME
+ )
+ ENGINE=OLAP
+ DUPLICATE KEY(id)
+ DISTRIBUTED BY HASH(id) BUCKETS 16
+ PROPERTIES (
+ "replication_num" = "1"
+ );
+
+ CREATE TABLE IF NOT EXISTS table13 (
+ id BIGINT NOT NULL,
+ value13 DECIMAL(20,6),
+ related_id BIGINT,
+ ts DATETIME
+ )
+ ENGINE=OLAP
+ DUPLICATE KEY(id)
+ DISTRIBUTED BY HASH(id) BUCKETS 16
+ PROPERTIES (
+ "replication_num" = "1"
+ );
+
+ CREATE TABLE IF NOT EXISTS table14 (
+ id BIGINT NOT NULL,
+ value14 DECIMAL(20,6),
+ related_id BIGINT,
+ ts DATETIME
+ )
+ ENGINE=OLAP
+ DUPLICATE KEY(id)
+ DISTRIBUTED BY HASH(id) BUCKETS 16
+ PROPERTIES (
+ "replication_num" = "1"
+ );
+
+ CREATE TABLE IF NOT EXISTS table15 (
+ id BIGINT NOT NULL,
+ value15 DECIMAL(20,6),
+ related_id BIGINT,
+ ts DATETIME
+ )
+ ENGINE=OLAP
+ DUPLICATE KEY(id)
+ DISTRIBUTED BY HASH(id) BUCKETS 16
+ PROPERTIES (
+ "replication_num" = "1"
+ );
+
+ CREATE TABLE IF NOT EXISTS table16 (
+ id BIGINT NOT NULL,
+ value16 DECIMAL(20,6),
+ related_id BIGINT,
+ ts DATETIME
+ )
+ ENGINE=OLAP
+ DUPLICATE KEY(id)
+ DISTRIBUTED BY HASH(id) BUCKETS 16
+ PROPERTIES (
+ "replication_num" = "1"
+ );
+
+ CREATE TABLE IF NOT EXISTS table17 (
+ id BIGINT NOT NULL,
+ value17 DECIMAL(20,6),
+ related_id BIGINT,
+ ts DATETIME
+ )
+ ENGINE=OLAP
+ DUPLICATE KEY(id)
+ DISTRIBUTED BY HASH(id) BUCKETS 16
+ PROPERTIES (
+ "replication_num" = "1"
+ );
+
+ CREATE TABLE IF NOT EXISTS table18 (
+ id BIGINT NOT NULL,
+ value18 DECIMAL(20,6),
+ related_id BIGINT,
+ ts DATETIME
+ )
+ ENGINE=OLAP
+ DUPLICATE KEY(id)
+ DISTRIBUTED BY HASH(id) BUCKETS 16
+ PROPERTIES (
+ "replication_num" = "1"
+ );
+
+ CREATE TABLE IF NOT EXISTS table19 (
+ id BIGINT NOT NULL,
+ value19 DECIMAL(20,6),
+ related_id BIGINT,
+ ts DATETIME
+ )
+ ENGINE=OLAP
+ DUPLICATE KEY(id)
+ DISTRIBUTED BY HASH(id) BUCKETS 16
+ PROPERTIES (
+ "replication_num" = "1"
+ );
+
+ CREATE TABLE IF NOT EXISTS table20 (
+ id BIGINT NOT NULL,
+ value20 DECIMAL(20,6),
+ related_id BIGINT,
+ ts DATETIME
+ )
+ ENGINE=OLAP
+ DUPLICATE KEY(id)
+ DISTRIBUTED BY HASH(id) BUCKETS 16
+ PROPERTIES (
+ "replication_num" = "1"
+ );
+
+ CREATE TABLE IF NOT EXISTS table21 (
+ id BIGINT NOT NULL,
+ value21 DECIMAL(20,6),
+ related_id BIGINT,
+ ts DATETIME
+ )
+ ENGINE=OLAP
+ DUPLICATE KEY(id)
+ DISTRIBUTED BY HASH(id) BUCKETS 16
+ PROPERTIES (
+ "replication_num" = "1"
+ );
+
+
+ INSERT INTO table1
+ SELECT
+ number,
+ RAND()*2,
+ CAST(RAND()*2 AS BIGINT),
+ NOW() - INTERVAL CAST(RAND()*365 AS INT) DAY
+ FROM seq WHERE number = 2;
+
+ INSERT INTO table2
+ SELECT
+ number,
+ RAND()*2,
+ CAST(RAND()*2 AS BIGINT),
+ NOW() - INTERVAL CAST(RAND()*365 AS INT) DAY
+ FROM seq WHERE number = 2;
+
+ INSERT INTO table3
+ SELECT
+ number,
+ RAND()*2,
+ CAST(RAND()*2 AS BIGINT),
+ NOW() - INTERVAL CAST(RAND()*365 AS INT) DAY
+ FROM seq WHERE number = 2;
+
+ INSERT INTO table4
+ SELECT
+ number,
+ RAND()*2,
+ CAST(RAND()*2 AS BIGINT),
+ NOW() - INTERVAL CAST(RAND()*365 AS INT) DAY
+ FROM seq WHERE number = 2;
+
+ INSERT INTO table5
+ SELECT
+ number,
+ RAND()*2,
+ CAST(RAND()*2 AS BIGINT),
+ NOW() - INTERVAL CAST(RAND()*365 AS INT) DAY
+ FROM seq WHERE number = 2;
+
+ INSERT INTO table6
+ SELECT
+ number,
+ RAND()*2,
+ CAST(RAND()*2 AS BIGINT),
+ NOW() - INTERVAL CAST(RAND()*365 AS INT) DAY
+ FROM seq WHERE number = 2;
+
+ INSERT INTO table7
+ SELECT
+ number,
+ RAND()*2,
+ CAST(RAND()*2 AS BIGINT),
+ NOW() - INTERVAL CAST(RAND()*365 AS INT) DAY
+ FROM seq WHERE number = 2;
+
+ INSERT INTO table8
+ SELECT
+ number,
+ RAND()*2,
+ CAST(RAND()*2 AS BIGINT),
+ NOW() - INTERVAL CAST(RAND()*365 AS INT) DAY
+ FROM seq WHERE number = 2;
+
+ INSERT INTO table9
+ SELECT
+ number,
+ RAND()*2,
+ CAST(RAND()*2 AS BIGINT),
+ NOW() - INTERVAL CAST(RAND()*365 AS INT) DAY
+ FROM seq WHERE number = 2;
+
+ INSERT INTO table10
+ SELECT
+ number,
+ RAND()*2,
+ CAST(RAND()*2 AS BIGINT),
+ NOW() - INTERVAL CAST(RAND()*365 AS INT) DAY
+ FROM seq WHERE number = 2;
+
+ INSERT INTO table11
+ SELECT
+ number,
+ RAND()*2,
+ CAST(RAND()*2 AS BIGINT),
+ NOW() - INTERVAL CAST(RAND()*365 AS INT) DAY
+ FROM seq WHERE number = 2;
+
+ INSERT INTO table12
+ SELECT
+ number,
+ RAND()*2,
+ CAST(RAND()*2 AS BIGINT),
+ NOW() - INTERVAL CAST(RAND()*365 AS INT) DAY
+ FROM seq WHERE number = 2;
+
+ INSERT INTO table13
+ SELECT
+ number,
+ RAND()*2,
+ CAST(RAND()*2 AS BIGINT),
+ NOW() - INTERVAL CAST(RAND()*365 AS INT) DAY
+ FROM seq WHERE number = 2;
+
+ INSERT INTO table14
+ SELECT
+ number,
+ RAND()*2,
+ CAST(RAND()*2 AS BIGINT),
+ NOW() - INTERVAL CAST(RAND()*365 AS INT) DAY
+ FROM seq WHERE number = 2;
+
+ INSERT INTO table15
+ SELECT
+ number,
+ RAND()*2,
+ CAST(RAND()*2 AS BIGINT),
+ NOW() - INTERVAL CAST(RAND()*365 AS INT) DAY
+ FROM seq WHERE number = 2;
+
+ INSERT INTO table16
+ SELECT
+ number,
+ RAND()*2,
+ CAST(RAND()*2 AS BIGINT),
+ NOW() - INTERVAL CAST(RAND()*365 AS INT) DAY
+ FROM seq WHERE number = 2;
+
+ INSERT INTO table17
+ SELECT
+ number,
+ RAND()*2,
+ CAST(RAND()*2 AS BIGINT),
+ NOW() - INTERVAL CAST(RAND()*365 AS INT) DAY
+ FROM seq WHERE number = 2;
+
+ INSERT INTO table18
+ SELECT
+ number,
+ RAND()*2,
+ CAST(RAND()*2 AS BIGINT),
+ NOW() - INTERVAL CAST(RAND()*365 AS INT) DAY
+ FROM seq WHERE number = 2;
+
+ INSERT INTO table19
+ SELECT
+ number,
+ RAND()*2,
+ CAST(RAND()*2 AS BIGINT),
+ NOW() - INTERVAL CAST(RAND()*365 AS INT) DAY
+ FROM seq WHERE number = 2;
+
+ INSERT INTO table20
+ SELECT
+ number,
+ RAND()*2,
+ CAST(RAND()*2 AS BIGINT),
+ NOW() - INTERVAL CAST(RAND()*365 AS INT) DAY
+ FROM seq WHERE number = 2;
+
+ INSERT INTO table21
+ SELECT
+ number,
+ RAND()*2,
+ CAST(RAND()*2 AS BIGINT),
+ NOW() - INTERVAL CAST(RAND()*365 AS INT) DAY
+ FROM seq WHERE number = 2;
+
+
+ INSERT INTO table1 (id, value1, related_id, ts) VALUES
+ (1, -9.432227, 114, '2025-06-17 17:28:08'),
+ (2, -2.109207, 130, '2025-06-05 17:28:08'),
+ (3, -4.487591, 118, '2025-06-15 17:28:08'),
+ (4, -8.823451, 133, '2025-06-13 17:28:08'),
+ (5, 7.741022, 138, '2025-06-08 17:28:08');
+ """
+
+ sql """
+ SELECT * FROM (SELECT
+ t1.id,
+ (SELECT sum(ratio) FROM (SELECT
+ t2.id,
+ (SELECT sum(ratio) FROM (SELECT
+ t3.id,
+ (SELECT sum(ratio) FROM (SELECT
+ t4.id,
+ (SELECT sum(ratio) FROM (SELECT
+ t5.id,
+ (SELECT sum(ratio) FROM (SELECT
+ t6.id,
+ (SELECT sum(ratio) FROM (SELECT
+ t7.id,
+ (SELECT sum(ratio) FROM (SELECT
+ t8.id,
+ (SELECT sum(ratio) FROM (SELECT
+ t9.id,
+ (SELECT sum(ratio) FROM (SELECT
+ t10.id,
+ (SELECT sum(ratio) FROM (SELECT
+ t11.id,
+ (SELECT sum(ratio) FROM (SELECT
+ t12.id,
+ (SELECT sum(ratio) FROM (SELECT
+ t13.id,
+ (SELECT sum(ratio) FROM (SELECT
+ t14.id,
+ (SELECT sum(ratio) FROM (SELECT
+ t15.id,
+ (SELECT sum(ratio) FROM (SELECT
+ t16.id,
+ (SELECT sum(ratio) FROM (SELECT
+ t17.id,
+ (SELECT sum(ratio) FROM (SELECT
+ t18.id,
+ (SELECT sum(ratio) FROM (SELECT
+ t19.id,
+ (SELECT sum(ratio) FROM (SELECT
+ t20.id,
+ (SELECT sum(ratio) FROM (SELECT
+ t21.id,
+ (SELECT sum(ratio) FROM (SELECT
+ t22.id,
+ (SELECT sum(ratio) FROM (SELECT
+ t23.id,
+ (SELECT sum(ratio) FROM (SELECT
+ t24.id,
+ (SELECT sum(ratio) FROM (SELECT
+ t25.id,
+ (SELECT sum(ratio) FROM (SELECT
+ t26.id,
+ (SELECT sum(ratio) FROM (SELECT
+ t27.id,
+ (SELECT sum(ratio) FROM (SELECT
+ t28.id,
+ (SELECT sum(ratio) FROM (SELECT
+ t29.id,
+ (SELECT sum(ratio) FROM (SELECT
+ t30.id,
+ (SELECT sum(ratio) FROM (SELECT
+ t31.id,
+ (SELECT sum(ratio) FROM (SELECT
+ t32.id,
+ (SELECT sum(ratio) FROM (SELECT
+ t33.id,
+ (SELECT sum(ratio) FROM (SELECT
+ t34.id,
+ (SELECT sum(ratio) FROM (SELECT
+ t35.id,
+ (SELECT sum(ratio) FROM (SELECT
+ t36.id,
+ (SELECT sum(ratio) FROM (SELECT
+ t37.id,
+ (SELECT sum(ratio) FROM (SELECT
+ t38.id,
+ (SELECT sum(ratio) FROM (SELECT
+ t39.id,
+ (SELECT sum(ratio) FROM (SELECT
+ t40.id,
+ (SELECT sum(ratio) FROM (SELECT
+ t41.id,
+ (SELECT sum(ratio) FROM (SELECT
+ t42.id,
+ (SELECT sum(ratio) FROM (SELECT
+ t43.id,
+ (SELECT sum(ratio) FROM (SELECT
+ t44.id,
+ (SELECT sum(ratio) FROM (SELECT
+ t45.id,
+ (SELECT sum(ratio) FROM (SELECT
+ t46.id,
+ (SELECT sum(ratio) FROM (SELECT
+ t47.id,
+ (SELECT sum(ratio) FROM (SELECT
+ t48.id,
+ (SELECT sum(ratio) FROM (SELECT
+ t49.id,
+ (SELECT total FROM (SELECT
+ SUM(t50.value11) AS total
+ FROM table11 t50
+ WHERE t50.related_id = t49.id
+ ) AS layer50) * 1.0 / COUNT(*) AS ratio
+ FROM table10 t49
+ WHERE EXISTS (
+ SELECT 1 FROM table11
+ WHERE id = t49.related_id
+ )
+ GROUP BY t49.id) AS layer49) * 1.0 / COUNT(*) AS ratio
+ FROM table9 t48
+ WHERE EXISTS (
+ SELECT 1 FROM table10
+ WHERE id = t48.related_id
+ )
+ GROUP BY t48.id) AS layer48) * 1.0 / COUNT(*) AS ratio
+ FROM table8 t47
+ WHERE EXISTS (
+ SELECT 1 FROM table9
+ WHERE id = t47.related_id
+ )
+ GROUP BY t47.id) AS layer47) * 1.0 / COUNT(*) AS ratio
+ FROM table7 t46
+ WHERE EXISTS (
+ SELECT 1 FROM table8
+ WHERE id = t46.related_id
+ )
+ GROUP BY t46.id) AS layer46) * 1.0 / COUNT(*) AS ratio
+ FROM table6 t45
+ WHERE EXISTS (
+ SELECT 1 FROM table7
+ WHERE id = t45.related_id
+ )
+ GROUP BY t45.id) AS layer45) * 1.0 / COUNT(*) AS ratio
+ FROM table5 t44
+ WHERE EXISTS (
+ SELECT 1 FROM table6
+ WHERE id = t44.related_id
+ )
+ GROUP BY t44.id) AS layer44) * 1.0 / COUNT(*) AS ratio
+ FROM table4 t43
+ WHERE EXISTS (
+ SELECT 1 FROM table5
+ WHERE id = t43.related_id
+ )
+ GROUP BY t43.id) AS layer43) * 1.0 / COUNT(*) AS ratio
+ FROM table3 t42
+ WHERE EXISTS (
+ SELECT 1 FROM table4
+ WHERE id = t42.related_id
+ )
+ GROUP BY t42.id) AS layer42) * 1.0 / COUNT(*) AS ratio
+ FROM table2 t41
+ WHERE EXISTS (
+ SELECT 1 FROM table3
+ WHERE id = t41.related_id
+ )
+ GROUP BY t41.id) AS layer41) * 1.0 / COUNT(*) AS ratio
+ FROM table1 t40
+ WHERE EXISTS (
+ SELECT 1 FROM table2
+ WHERE id = t40.related_id
+ )
+ GROUP BY t40.id) AS layer40) * 1.0 / COUNT(*) AS ratio
+ FROM table20 t39
+ WHERE EXISTS (
+ SELECT 1 FROM table1
+ WHERE id = t39.related_id
+ )
+ GROUP BY t39.id) AS layer39) * 1.0 / COUNT(*) AS ratio
+ FROM table19 t38
+ WHERE EXISTS (
+ SELECT 1 FROM table20
+ WHERE id = t38.related_id
+ )
+ GROUP BY t38.id) AS layer38) * 1.0 / COUNT(*) AS ratio
+ FROM table18 t37
+ WHERE EXISTS (
+ SELECT 1 FROM table19
+ WHERE id = t37.related_id
+ )
+ GROUP BY t37.id) AS layer37) * 1.0 / COUNT(*) AS ratio
+ FROM table17 t36
+ WHERE EXISTS (
+ SELECT 1 FROM table18
+ WHERE id = t36.related_id
+ )
+ GROUP BY t36.id) AS layer36) * 1.0 / COUNT(*) AS ratio
+ FROM table16 t35
+ WHERE EXISTS (
+ SELECT 1 FROM table17
+ WHERE id = t35.related_id
+ )
+ GROUP BY t35.id) AS layer35) * 1.0 / COUNT(*) AS ratio
+ FROM table15 t34
+ WHERE EXISTS (
+ SELECT 1 FROM table16
+ WHERE id = t34.related_id
+ )
+ GROUP BY t34.id) AS layer34) * 1.0 / COUNT(*) AS ratio
+ FROM table14 t33
+ WHERE EXISTS (
+ SELECT 1 FROM table15
+ WHERE id = t33.related_id
+ )
+ GROUP BY t33.id) AS layer33) * 1.0 / COUNT(*) AS ratio
+ FROM table13 t32
+ WHERE EXISTS (
+ SELECT 1 FROM table14
+ WHERE id = t32.related_id
+ )
+ GROUP BY t32.id) AS layer32) * 1.0 / COUNT(*) AS ratio
+ FROM table12 t31
+ WHERE EXISTS (
+ SELECT 1 FROM table13
+ WHERE id = t31.related_id
+ )
+ GROUP BY t31.id) AS layer31) * 1.0 / COUNT(*) AS ratio
+ FROM table11 t30
+ WHERE EXISTS (
+ SELECT 1 FROM table12
+ WHERE id = t30.related_id
+ )
+ GROUP BY t30.id) AS layer30) * 1.0 / COUNT(*) AS ratio
+ FROM table10 t29
+ WHERE EXISTS (
+ SELECT 1 FROM table11
+ WHERE id = t29.related_id
+ )
+ GROUP BY t29.id) AS layer29) * 1.0 / COUNT(*) AS ratio
+ FROM table9 t28
+ WHERE EXISTS (
+ SELECT 1 FROM table10
+ WHERE id = t28.related_id
+ )
+ GROUP BY t28.id) AS layer28) * 1.0 / COUNT(*) AS ratio
+ FROM table8 t27
+ WHERE EXISTS (
+ SELECT 1 FROM table9
+ WHERE id = t27.related_id
+ )
+ GROUP BY t27.id) AS layer27) * 1.0 / COUNT(*) AS ratio
+ FROM table7 t26
+ WHERE EXISTS (
+ SELECT 1 FROM table8
+ WHERE id = t26.related_id
+ )
+ GROUP BY t26.id) AS layer26) * 1.0 / COUNT(*) AS ratio
+ FROM table6 t25
+ WHERE EXISTS (
+ SELECT 1 FROM table7
+ WHERE id = t25.related_id
+ )
+ GROUP BY t25.id) AS layer25) * 1.0 / COUNT(*) AS ratio
+ FROM table5 t24
+ WHERE EXISTS (
+ SELECT 1 FROM table6
+ WHERE id = t24.related_id
+ )
+ GROUP BY t24.id) AS layer24) * 1.0 / COUNT(*) AS ratio
+ FROM table4 t23
+ WHERE EXISTS (
+ SELECT 1 FROM table5
+ WHERE id = t23.related_id
+ )
+ GROUP BY t23.id) AS layer23) * 1.0 / COUNT(*) AS ratio
+ FROM table3 t22
+ WHERE EXISTS (
+ SELECT 1 FROM table4
+ WHERE id = t22.related_id
+ )
+ GROUP BY t22.id) AS layer22) * 1.0 / COUNT(*) AS ratio
+ FROM table2 t21
+ WHERE EXISTS (
+ SELECT 1 FROM table3
+ WHERE id = t21.related_id
+ )
+ GROUP BY t21.id) AS layer21) * 1.0 / COUNT(*) AS ratio
+ FROM table1 t20
+ WHERE EXISTS (
+ SELECT 1 FROM table2
+ WHERE id = t20.related_id
+ )
+ GROUP BY t20.id) AS layer20) * 1.0 / COUNT(*) AS ratio
+ FROM table20 t19
+ WHERE EXISTS (
+ SELECT 1 FROM table1
+ WHERE id = t19.related_id
+ )
+ GROUP BY t19.id) AS layer19) * 1.0 / COUNT(*) AS ratio
+ FROM table19 t18
+ WHERE EXISTS (
+ SELECT 1 FROM table20
+ WHERE id = t18.related_id
+ )
+ GROUP BY t18.id) AS layer18) * 1.0 / COUNT(*) AS ratio
+ FROM table18 t17
+ WHERE EXISTS (
+ SELECT 1 FROM table19
+ WHERE id = t17.related_id
+ )
+ GROUP BY t17.id) AS layer17) * 1.0 / COUNT(*) AS ratio
+ FROM table17 t16
+ WHERE EXISTS (
+ SELECT 1 FROM table18
+ WHERE id = t16.related_id
+ )
+ GROUP BY t16.id) AS layer16) * 1.0 / COUNT(*) AS ratio
+ FROM table16 t15
+ WHERE EXISTS (
+ SELECT 1 FROM table17
+ WHERE id = t15.related_id
+ )
+ GROUP BY t15.id) AS layer15) * 1.0 / COUNT(*) AS ratio
+ FROM table15 t14
+ WHERE EXISTS (
+ SELECT 1 FROM table16
+ WHERE id = t14.related_id
+ )
+ GROUP BY t14.id) AS layer14) * 1.0 / COUNT(*) AS ratio
+ FROM table14 t13
+ WHERE EXISTS (
+ SELECT 1 FROM table15
+ WHERE id = t13.related_id
+ )
+ GROUP BY t13.id) AS layer13) * 1.0 / COUNT(*) AS ratio
+ FROM table13 t12
+ WHERE EXISTS (
+ SELECT 1 FROM table14
+ WHERE id = t12.related_id
+ )
+ GROUP BY t12.id) AS layer12) * 1.0 / COUNT(*) AS ratio
+ FROM table12 t11
+ WHERE EXISTS (
+ SELECT 1 FROM table13
+ WHERE id = t11.related_id
+ )
+ GROUP BY t11.id) AS layer11) * 1.0 / COUNT(*) AS ratio
+ FROM table11 t10
+ WHERE EXISTS (
+ SELECT 1 FROM table12
+ WHERE id = t10.related_id
+ )
+ GROUP BY t10.id) AS layer10) * 1.0 / COUNT(*) AS ratio
+ FROM table10 t9
+ WHERE EXISTS (
+ SELECT 1 FROM table11
+ WHERE id = t9.related_id
+ )
+ GROUP BY t9.id) AS layer9) * 1.0 / COUNT(*) AS ratio
+ FROM table9 t8
+ WHERE EXISTS (
+ SELECT 1 FROM table10
+ WHERE id = t8.related_id
+ )
+ GROUP BY t8.id) AS layer8) * 1.0 / COUNT(*) AS ratio
+ FROM table8 t7
+ WHERE EXISTS (
+ SELECT 1 FROM table9
+ WHERE id = t7.related_id
+ )
+ GROUP BY t7.id) AS layer7) * 1.0 / COUNT(*) AS ratio
+ FROM table7 t6
+ WHERE EXISTS (
+ SELECT 1 FROM table8
+ WHERE id = t6.related_id
+ )
+ GROUP BY t6.id) AS layer6) * 1.0 / COUNT(*) AS ratio
+ FROM table6 t5
+ WHERE EXISTS (
+ SELECT 1 FROM table7
+ WHERE id = t5.related_id
+ )
+ GROUP BY t5.id) AS layer5) * 1.0 / COUNT(*) AS ratio
+ FROM table5 t4
+ WHERE EXISTS (
+ SELECT 1 FROM table6
+ WHERE id = t4.related_id
+ )
+ GROUP BY t4.id) AS layer4) * 1.0 / COUNT(*) AS ratio
+ FROM table4 t3
+ WHERE EXISTS (
+ SELECT 1 FROM table5
+ WHERE id = t3.related_id
+ )
+ GROUP BY t3.id) AS layer3) * 1.0 / COUNT(*) AS ratio
+ FROM table3 t2
+ WHERE EXISTS (
+ SELECT 1 FROM table4
+ WHERE id = t2.related_id
+ )
+ GROUP BY t2.id) AS layer2) * 1.0 / COUNT(*) AS ratio
+ FROM table2 t1
+ WHERE EXISTS (
+ SELECT 1 FROM table3
+ WHERE id = t1.related_id
+ )
+ GROUP BY t1.id) AS layer1;
+ """
+}
+
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]