在VB.NET中将基于另一列的不同总和和计数列添加到datatable中
我有一个超大的数据表(来自PostgreSQL数据库中的分隔字符串单元格),大约有40k行。示例数据列:在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计
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 bycustomer\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))。非常感谢你!你应该得到一大杯啤酒:-)谢谢你的啤酒,我很高兴它有帮助。如果你的问题解决了,你可以接受答案