【发布时间】:2020-11-01 03:12:43
【问题描述】:
我在 PostgreSQL 数据库中有以下 Orders 表
Order_date | Revenue
--------------------
2020-10-01 | 10
2020-10-02 | 5
2020-10-03 | 10
2020-10-04 | 5
2020-10-05 | 10
我需要返回过去 2 天内每个 order_date 的累计收入总和,包括该订单日期的收入。我正在使用以下查询
SELECT o1.order_date,
Sum(o2.revenue) as Revenue_sum
FROM orders o1
JOIN orders o2
ON o1.order_date BETWEEN o2.order_date AND o2.order_date + 2
GROUP BY o1.order_date
ORDER BY o1.order_date
它返回以下结果
Order_date | Revenue_sum
------------------------
2020-10-01 | 10
2020-10-02 | 15
2020-10-03 | 25
2020-10-04 | 20
2020-10-05 | 25
将按照查询处理的逻辑顺序执行以下步骤
- “JOIN”将首先通过执行交叉连接形成笛卡尔积,因此来自 o1 的每一行都将连接到 o2 的每一行。
- 那么'ON'子句中的限定符条件将只选择满足条件的行
- 从选定的行中,将通过 GROUP BY 子句 (o1.order_date) 按每个组汇总收入
根据上面的执行步骤,我正在尝试可视化查询的处理步骤。
第 1 步将是交叉连接,如下所示
第 2 步将是基于“ON”条件的限定条件。我无法根据“JOIN”中指定的条件以及如何可视化从步骤 1 中选择哪些行
然后,第 3 步将对行进行分组并对收入求和
1.笛卡尔积
o1.order_date | o2.order_date | o2.revenue
-------------------------------------------
2020-10-01 | 2020-10-01 | 10
2020-10-01 | 2020-10-02 | 5
2020-10-01 | 2020-10-03 | 10
2020-10-01 | 2020-10-04 | 5
2020-10-01 | 2020-10-05 | 10
2020-10-02 | 2020-10-01 | 10
2020-10-02 | 2020-10-02 | 5
2020-10-02 | 2020-10-03 | 10
2020-10-02 | 2020-10-04 | 5
2020-10-02 | 2020-10-05 | 10
2020-10-03 | 2020-10-01 | 10
2020-10-03 | 2020-10-02 | 5
2020-10-03 | 2020-10-03 | 10
2020-10-03 | 2020-10-04 | 5
2020-10-03 | 2020-10-05 | 10
2020-10-04 | 2020-10-01 | 10
2020-10-04 | 2020-10-02 | 5
2020-10-04 | 2020-10-03 | 10
2020-10-04 | 2020-10-04 | 5
2020-10-04 | 2020-10-05 | 10
2020-10-05 | 2020-10-01 | 10
2020-10-05 | 2020-10-02 | 5
2020-10-05 | 2020-10-03 | 10
2020-10-05 | 2020-10-04 | 5
2020-10-05 | 2020-10-05 | 10
2。基于“开”条件的资格。将从上述第 1 步中选择哪些行?
【问题讨论】:
-
选择所有符合条件的行,分别应用于每一行。当使用较小的数据集写出来时,这可能更容易“可视化过程”,例如。 (1, 2, 3) 条件为 a.i >= b.i 和 a.i
-
如果您编写了查询,我看不出您在理解它的工作原理方面有什么困难。
-
我使用各种组合得出最终查询,但逻辑处理流程对我来说仍然不清楚。感谢这里专家的cmets和帖子,我现在清楚逻辑处理了
标签: sql postgresql self-join