如何用第一行的数据填充后续数据?

时间:2017-02-03 22:29:43

标签: sql sql-server

我有一个数据集,我是根据一些子查询创建的,这些子查询需要跟踪资助金额和收取的金额。

当前数据:

QuarterDiff   ActivationYear   ActivationQuarter   AmountFinanced   ChargeOffAmount
0             2015             1                   83831.00         19600.00
1             2015             1                   NULL             0.00
2             2015             1                   NULL             0.00
3             2015             1                   NULL             0.00
4             2015             1                   NULL             0.00

我遇到的问题是AmountFinanced的以下数据不应该是NULL,而是重复QuarterDiff 0 AmountFinanced值。有没有办法让QuarterDiff 0 AmountFinanced的值填充到以下QuarterDiff中?

所需结果(适用于ActivationYear 2015,ActivationQuarter 1):

QuarterDiff   ActivationYear   ActivationQuarter   AmountFinanced   ChargeOffAmount
0             2015             1                   83831.00         19600.00
1             2015             1                   83831.00         0.00
2             2015             1                   83831.00         0.00
3             2015             1                   83831.00         0.00
4             2015             1                   83831.00         0.00

1 个答案:

答案 0 :(得分:0)

此问题的快速解决方案是使用 AmountFinanced 列的子查询,如下所示

select  QuarterDiff,
        ActivationYear,
        ActivationQuarter,
        (select AmountFinanced
            from Finance_Table
            where QuarterDiff = 0
        ) as AmountFinanced,
        ChargeOffAmount
    from Finance_Table

这仅适用于季度和激活年份不会改变的情况,因为您知道应该使用的QuarterDiff来填充AmountFinanced,即QuarterDiff 0。

您可能面临的一个更难的问题涉及多年和季度,例如此表。

QuarterDiff   ActivationYear   ActivationQuarter   AmountFinanced   ChargeOffAmount
0             2015             1                   83831.00         19600.00
1             2015             1                   NULL             0.00
2             2015             1                   NULL             0.00
3             2015             2                   76931.00         0.00
4             2015             2                   NULL             0.00
5             2015             3                   101263.00        0.00
6             2015             3                   NULL             0.00
7             2015             3                   NULL             0.00
8             2015             4                   99754.00         0.00
9             2016             1                   69414.00         0.00
10            2016             2                   88200.00         0.00
11            2016             2                   NULL             0.00
12            2016             2                   NULL             0.00
13            2016             2                   NULL             0.00

这个并不容易,因为您不能只选择QuarterDiff 0来填充表格的其余部分。您想从给定年份和季度的领先记录中选择AmountFinanced。相反,我们可以使用相关子查询的聚合,这利用了AmountFinanced字段中的数据;也就是说,需要填充的那些是空的,因此它们不会干扰任何聚合。

select  QuarterDiff,
        ActivationYear,
        ActivationQuarter,
        (select max(AmountFinanced) -- or sum
            from Finance_Table ftsq
            where ftsq.ActivationYear = ft.ActivationYear
                and ftsq.ActivationQuarter = ft.ActivationQuarter
        ) as AmountFinanced,
        ChargeOffAmount
    from Finance_Table ft

为了更好地理解其工作原理,让我们考虑一下ActivationYear = 2015和ActivationQuarter = 3的记录块。然后,子查询变为

select max(AmountFinanced)
    from Finance_Table ftsq
    where ftsq.ActivationYear = 2015
        and ftsq.ActivationQuarter = 3

因此,子查询会拉出表格的一部分,在该部分上汇总聚合,对于此示例,结果为101263.00,并将该结果应用于AmountFinanced列。由于我们使用变量而不是数字2015和3,因此能够对表中的每条记录进行正确的操作。

*作为旁注,更安全的方法是使用排名,无论AmountFinanced列中的数据如何,都是健壮的。但是你现在可能已经足够咀嚼了。