在VB.NET中将基于另一列的不同总和和计数列添加到datatable中

在VB.NET中将基于另一列的不同总和和计数列添加到datatable中,vb.net,datatable,count,distinct,Vb.net,Datatable,Count,Distinct,我有一个超大的数据表(来自PostgreSQL数据库中的分隔字符串单元格),大约有40k行。示例数据列: invoice customer_id amount 1 1 150,50 2 1 149,50 3 2 50,50 4 3 49,50 我正在尝试向这个数据表添加两列。其中一个应显示发票数量(客户id计

我有一个超大的数据表(来自PostgreSQL数据库中的分隔字符串单元格),大约有40k行。示例数据列:

invoice   customer_id     amount
1         1               150,50
2         1               149,50
3         2               50,50
4         3               49,50
我正在尝试向这个数据表添加两列。其中一个应显示发票数量(客户id计数),但另一个应显示每个客户的金额总和,如下所示:

invoice   customer_id     amount    invoice_count   amount_total
1         1               150,50    2               300,00
2         1               149,50    2               300,00
3         2               50,50     1               50,50
4         3               49,50     1               49,50
使用此选项:

For i = 0 To dt.Rows.Count - 1
   Dim distinctDT As DataTable = dt.DefaultView.ToTable(True, "customer_id", "amount")
   distinctDT.DefaultView.RowFilter = "customer_id = " & dt.Rows(i).Item("customer_id")
   dt.Rows(i).Item("count") = distinctDT.DefaultView.Count
Next
工作正常,但需要很长时间(整个数据表大约需要2个小时!),因为每个“i”辅助数据表都会被创建(我想是的)。在Postgres中,我可以在Select和group by
customer\u id
中使用
count(customer\u id)over(按customer\u id划分)
,并在几秒钟内显示我的查询结果


在不创建不同的数据表并在每次“i”滴答声中对其进行过滤的情况下,是否有可能解决此问题?提前谢谢

您可以使用LINQ的强大功能,在本例中,它与类似于字典的
查找(TKeyx,TValue)
相结合。它效率高,代码简洁易读:

Dim customerLookup = dt.AsEnumerable().ToLookup(Function(r) r("customer_id"))
         
For Each row As DataRow In dt.Rows
    Dim customerRows = customerLookup(row("customer_id"))
    row("count") = customerRows.Count()
    row("amount_total") = customerRows.Sum(Function(r)row.Field(Of Decimal)("amount"))
Next

为什么不使用查询来更新数据,并使用触发器进行更新呢?我认为这样会更有效。非常感谢。它可以快速计算客户数量,但我无法像上面写的那样用双精度/小数构建最后一个总和列(总金额),你能帮我吗?我完全是LINQ的初学者,但我知道我必须尽快学习它。@DARIUS:我修改了我的答案,展示了一种不同的方法,它结合了字典(即查找)和LINQ的功能。这个解决方案真是神乎其神!从分隔字符串(数字数据被检测为字符串)填充后,我在DT中的列类型检测出现了一些小问题,但很容易解决。只需在addingcolumns部分添加数据类型,比如:.columns.add(“amount”,GetType(Decimal))。非常感谢你!你应该得到一大杯啤酒:-)谢谢你的啤酒,我很高兴它有帮助。如果你的问题解决了,你可以接受答案