SQL : 设置操作对每条记录执行逻辑

SQL : Set operation to perform logic for each record

Table 1 - 升级,Table2 - 数据

需求是:对于数据table中的所有记录,我们需要进行升级。

示例 1 - 数据 table 中的记录 1,年份是 2014,经济年份是 2018。因此,我们需要将值 (600) 从 2014 升级到 2015,然后到 2016,然后到 2017 . 因此,最终值为 600*5*6*7

示例 2 - 数据 table 中的记录 3 将升级两次 - 从 2015 年到 2016 年,然后到 2017 年。因此,最终值为 1000*6*7 必须对数据 table.

中的所有记录执行此操作

我不想使用游标,因为我有 300 万条记录可以执行此操作。

请提出一些使用集合操作执行的想法

    create table data
    ([year] int,
    value int,
    economic_year int,
    modelid int,
    shopid int)

    create table escalation
    ([year] int,
    shopid int,
    value_es int
    )


    insert into data
    values(
    2014,600,2018,5,1),
    (2014,600,2018,5,1),
    (2015,1000,2018,5,1),
    (2016,2000,2018,5,1),
    (2017,3000,2018,5,1)

    insert into escalation
    values
    (2014,1,4),
    (2015,1,5),
    (2016,1,6),
    (2017,1,7)


    select * from escalation
    select * from data

您可以这样做的一种方法是使用第三个 table 预先填充所有可能的 "update paths" 和相应的值。例如,如果您的年份是 2014 年,经济年是 2018 年,那么您的乘数 (value_es) 就是 120 (4*5*6)。像这样:

您将在 data.year = start_year 和 data.economic_year = econ_year 两列上将数据 table 连接到这个新的 table。然后,您的新值将是 data.value * val.

您可以创建一个简单的 ETL 过程,最初填充这个新的 table 并在日历滚动到新的一年时更新它。如果您有任何问题,请告诉我您的想法。