基于日期阈值的重复项总和

时间:2018-12-04 05:31:27

标签: excel excel-formula duplicates max

我有以下几列数据:

 Unique ID | Value | Date
     1     |   20  | 15/10/2018
     2     |   30  | 15/10/2018
     1     |   40  | 16/10/2018
     2     |   50  | 16/10/2018

然后我需要编写一个公式以基于日期阈值对“值”列求和,但是我只想包括每个唯一ID的最大值。

Date Threshold | Sum Formula
16/10/2018     | =SUMIF(C:C,"<="&F2,B:B)

很显然,上面的公式将求和所有值(140)。我只需要将单个MAX值的总和小于或等于每个唯一ID的阈值日期(40 + 50 = 90)。

2 个答案:

答案 0 :(得分:0)

第1步)生成唯一的ID列表

创建唯一ID列表。有一些公式可以为您完成此操作,也可以将其键入。假设您在示例中将ID写入F2:F3

第2步)截止日期

将日期截止日期放到一个单元格中,比如说E2。

第3步)找到最大值

我相信2016年会有MAXIF函数。使用它根据唯一ID和<=截止日期提取最大值。 MAXIF是更好的公式,但是很遗憾,我无法使用它,也无法为您提供更多的指导。如果您没有2016年或无法使用MAXIF,则可以使用聚合。聚合可以是执行类似数组操作的函数。因此,请勿在其功能内使用完整的列引用,否则将进行过多的计算,这将使您的系统陷入困境甚至更糟。

=AGGREGATE(14,6,$B$2:$B$5/(($A$2:$A$5=$F2)*($C$2:$C$5<=$E$2)),1)

将该公式放置在G2中,然后在每个唯一ID旁边复制下来。然后它将提供该日期之前或等于截止日期的最大值。

第4步)将最大值合计

在未使用的列中,将上一个公式的结果求和

=SUM(G2:G3)

这假设您的第一个表是A:C列。它还假定您的日期为excel序列日期格式,而不是伪装为excel日期的字符串。您可以使用=ISNUMBER(A1)测试后面的内容,其中A1是带有日期的单元格。值为false表示它是一个字符串,需要转换。调整范围以适合您的数据。

答案 1 :(得分:0)

任何单个工作表公式都将需要多个级别的循环计算,这将使公式以及随后的计算时间变得过于复杂。一个或多个“帮助”列可以大大减少这一点。

将其放入D2并填写。

=IF(COUNTIF(A$2:A2, A2)=1, AGGREGATE(14, 7, B:B/((C$1:C$9<=F$2)*(A$1:A$9=A2)), 1), "")

您要查找的已过滤最大值的总和只是D列的总和(例如=sum(D:D))。

  

请注意,我已添加到您的原始样本数据中,以更清楚地证明其他条件。

enter image description here

可以简化和限制所需步骤的用户定义功能可能是最好的选择。

使用Alt + F11打开VBE,使用Alt + I,M插入模块代码表,然后将此代码粘贴到新打开的代码窗格中。像其他任何标准工作表功能一样,使用新的自定义功能。

Option Explicit

Function maxUniqueWithThreshold(ids As Range, vals As Range, _
                                dates As Range, thold As Long)
    Static d As Object, i As Long

    'create a dictionary for unique ids only if not previously created
    If d Is Nothing Then Set d = CreateObject("scripting.dictionary")
    d.RemoveAll

    'limit the processing ranges
    Set ids = Intersect(ids, ids.Parent.UsedRange)
    Set vals = vals.Resize(ids.Rows.Count, ids.Columns.Count)
    Set dates = dates.Resize(ids.Rows.Count, ids.Columns.Count)

    'cycle through the processing ranges
    For i = 1 To ids.Cells.Count
        'is date within threshold?
        If dates.Cells(i) <= thold Then
            'collect the maximum value for each unique id into dictionary Items
            d.Item(ids.Cells(i).Value2) = _
              Application.Max(d.Item(ids.Cells(i).Value2), vals.Cells(i).Value2)
        End If
    Next i

    maxUniqueWithThreshold = Application.Sum(d.items)

End Function

请注意,与其他任何标准工作表功能一样,UDF正在G2中的工作表上使用。

enter image description here