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

时间:2018-10-01 16:11:57

标签: sql-server rdbms

Table 1 - Escalation, table2 - Data

表1-升级,表2-数据

要求是:对于数据表中的所有记录,我们需要执行上报。

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

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

我不想使用游标,因为我有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

1 个答案:

答案 0 :(得分:2)

您可以执行的一种方法是,在第三个表中预先填充所有可能的“更新路径”和相应的值。例如,如果您的年份为2014年,经济年度为2018年,则您的乘数(value_es)为120(4 * 5 * 6)。像这样:

sample table

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

您可以创建一个简单的ETL流程,该流程最初将填充此新表,并在日历将其滚动到新的一年时对其进行更新。让我知道您的想法或有任何疑问。