SQL 使用 python 脚本创建更新语句

SQL create update statement using python script

尝试使用脚本格式化 sql 更新,我在数据库中有名为 'col_prev12'、'col_prev24' 等的列,这些列需要添加每月存储桶,即 prev12 的 1-12 prev24 的 13-24 同样的事情需要发生多次。创建了一个数组来旋转并尝试格式化

prev12cols = [
    "colA",
    "colB",
    "colC",
    "colD"
]  


for col_prefix in prev12cols:
        monthly_cols.extend(["{0} = {3}{1}+{3}{2}".format(col_prefix + "_prev_12Mo", str(i),str(i+1), col_prefix) for i in range(1,12)])

每个数组元素对应于名为 colA1、colA2、...colA24 的列,我想要的是 colA_prev_12Mo = colA1 + colA2 + ...colA12,然后对 13-24 执行相同操作

选择有意义的变量名,不要一次性做太多,循序渐进。我们仅从列前缀开始:

column_prefixes = ["colA", "colB", "colC", "colD"]
for column_prefix in column_prefixes:
    print(column_prefix)

打印:

colA
colB
colC
colD

现在,我们添加一个额外的循环来确定数据可以追溯到多少年前。请记住 range 不包括 "last step",因此如果我们想要当前年份 0 和前一年 1,我们需要 运行 range(0, 2)。如果您改写 range(0, 1 + 1),它可能会对您有所帮助:

column_prefixes = ["colA", "colB", "colC", "colD"]
for column_prefix in column_prefixes:
    for year in range(0, 1 + 1):
        print(column_prefix, year)

打印:

colA 0
colA 1
colB 0
colB 1
colC 0
colC 1
colD 0
colD 1

现在,我们为月数添加最终循环。您必须根据 year:

选择 range 的开始和停止
column_prefixes = ["colA", "colB", "colC", "colD"]
for column_prefix in column_prefixes:
    for year in range(0, 1 + 1):
        for month in range(year * 12 + 1, (year + 1) * 12 + 1):
            print(column_prefix, year, month)

打印:

colA 0 1
colA 0 2
colA 0 3
colA 0 4
colA 0 5
colA 0 6
colA 0 7
colA 0 8
colA 0 9
colA 0 10
colA 0 11
colA 0 12
colA 1 13
colA 1 14
colA 1 15
colA 1 16
colA 1 17
colA 1 18
colA 1 19
colA 1 20
colA 1 21
colA 1 22
colA 1 23
colA 1 24
colB 0 1
colB 0 2
colB 0 3
colB 0 4
colB 0 5
colB 0 6
colB 0 7
colB 0 8
colB 0 9
colB 0 10
colB 0 11
colB 0 12
colB 1 13
colB 1 14
colB 1 15
colB 1 16
colB 1 17
colB 1 18
colB 1 19
colB 1 20
colB 1 21
colB 1 22
colB 1 23
colB 1 24
colC 0 1
colC 0 2
colC 0 3
colC 0 4
colC 0 5
colC 0 6
colC 0 7
colC 0 8
colC 0 9
colC 0 10
colC 0 11
colC 0 12
colC 1 13
colC 1 14
colC 1 15
colC 1 16
colC 1 17
colC 1 18
colC 1 19
colC 1 20
colC 1 21
colC 1 22
colC 1 23
colC 1 24
colD 0 1
colD 0 2
colD 0 3
colD 0 4
colD 0 5
colD 0 6
colD 0 7
colD 0 8
colD 0 9
colD 0 10
colD 0 11
colD 0 12
colD 1 13
colD 1 14
colD 1 15
colD 1 16
colD 1 17
colD 1 18
colD 1 19
colD 1 20
colD 1 21
colD 1 22
colD 1 23
colD 1 24

现在,我们需要的所有信息都可以在循环期间的某个时刻作为变量使用,我们只需要 assemble 您想要查看的行:

column_prefixes = ["colA", "colB", "colC", "colD"]
for column_prefix in column_prefixes:
    for year in range(0, 1 + 1):
        line = column_prefix + "_" + str(year + 1) + "_years_back = "
        for month in range(year * 12 + 1, (year + 1) * 12 + 1):
            line += column_prefix + str(month) + " + "
        line = line[:-3]
        print(line)

打印:

colA_1_years_back = colA1 + colA2 + colA3 + colA4 + colA5 + colA6 + colA7 + colA8 + colA9 + colA10 + colA11 + colA12
colA_2_years_back = colA13 + colA14 + colA15 + colA16 + colA17 + colA18 + colA19 + colA20 + colA21 + colA22 + colA23 + colA24
colB_1_years_back = colB1 + colB2 + colB3 + colB4 + colB5 + colB6 + colB7 + colB8 + colB9 + colB10 + colB11 + colB12
colB_2_years_back = colB13 + colB14 + colB15 + colB16 + colB17 + colB18 + colB19 + colB20 + colB21 + colB22 + colB23 + colB24
colC_1_years_back = colC1 + colC2 + colC3 + colC4 + colC5 + colC6 + colC7 + colC8 + colC9 + colC10 + colC11 + colC12
colC_2_years_back = colC13 + colC14 + colC15 + colC16 + colC17 + colC18 + colC19 + colC20 + colC21 + colC22 + colC23 + colC24
colD_1_years_back = colD1 + colD2 + colD3 + colD4 + colD5 + colD6 + colD7 + colD8 + colD9 + colD10 + colD11 + colD12
colD_2_years_back = colD13 + colD14 + colD15 + colD16 + colD17 + colD18 + colD19 + colD20 + colD21 + colD22 + colD23 + colD24

由于月份的每个循环迭代都会添加一个 " + ",因此在最后一个月之后的末尾有一个多余的 +,我们需要使用 line = line[:-3] 将其删除我们行的最后 3 个字符。当然,除了 print,您还可以将该行附加到列表中。

进一步阅读:上面的代码非常好,但如果您对不同的编码风格感兴趣,请考虑使用 f-strings 和列表理解。

最后说明:您可能不需要在 Python 中写这些行,可能只用 SQL 就可以做到这一点 - 但这是另一个问题。