我想知道是否有一种方法重写下面的oracle SQL脚本,以获得更好的处理时间。当前的版本非常慢,不能处理我正在使用的更大的数据集。
我正试着根据每个客户在公司工作的年数给他们分配一个数字。我需要它返回每个客户的起始年份,然后一直数到现在。我已经试着在下面解释了
对于已经与业务合作了5年的客户,我希望脚本返回以下
客户代码 | 年份编号 | 年数 | CUST1 | 2018 | 0 |
---|---|---|
CUST1 | 2019 | 1 |
CUST1 | 2020 | 2 |
CUST1 | 2021 | 3 |
CUST1 | 2022 | 4 |
CUST1 | 2023 | 5 |
从最内层的查询开始,包含customer_details表可能没有用处——您没有在其中使用任何东西。它唯一可能的用途是过滤掉customer_details表中没有的收入元素,但我真的怀疑您正在尝试这样做。
更简洁的方法是使用递归CTE,从每个客户最早的日期开始,然后每次向前滚动一年,直到它等于当前年份。
With Recursive Years AS (
SELECT REV.CUSTOMER_CODE, Year(MIN(REV.ORDER_DATE)) AS Year_Number
FROM REVENUE_TABLE REV
GROUP BY REV.CUSTOMER_CODE
UNION ALL
Select CUSTOMER_CODE, Year_Number+1
From Years
Where Year_Number < Year(Current_Date)
)
Select * from Years
现在你可以把剩下的表连接到这个结果,或者做任何你需要的事情。