【问题标题】:Filtering DataTable in VB.Net在 VB.Net 中过滤数据表
【发布时间】:2011-11-26 22:41:26
【问题描述】:
我有一个具有以下结构的数据表。
mid mname version baseID
------------------------------------
1 tag3 1 1
2 tag3 2 1
3 tag3 3 1
4 tag5 1 4
5 tag5 2 4
6 tag6 1 6
从上面的结构中,我需要一个类似这样的数据表。
我需要从数据表中获取最高版本。
mid mname version baseID
------------------------------------
3 tag3 3 1
5 tag5 2 4
6 tag6 1 6
如何创建与上述类似的数据表。
我正在使用 Vb.Net
提前致谢。
【问题讨论】:
标签:
vb.net
visual-studio-2008
datatable
【解决方案1】:
这取决于您如何填充原始数据表。如果您通过查询数据库来执行此操作,我会在查询本身中格式化结果集,例如:
(SQL)
select mid, mname, version, baseID
from <table> t
Join (select baseid, max(version) as version
from <table> group by baseID)maxVersion
on maxVersion.baseid = t.baseid and maxVersion.version = t.version
这将在将数据放入数据表之前对其进行格式化。
如果数据表是通过其他方式填充的,并且您需要对其进行过滤,则将其放入另一个数据表中。那么一个简单的方法(假设您的数据表始终以上述方式排序)是:
for i as integer = 0 to datatable.rows.count - 1
if i < datatable.rows.count - 1 Then
if datatable.rows(i)(4).value <> datatable.rows(i+1)(4).value then
newDataTable.rows.Add(datatable.rows(i).itemArray())
End If
Else
newDataTable.rows.Add(datatable.rows(i).itemArray())
End if
Next
现在语法可能在这里或那里不存在(在记事本中编写),但逻辑的想法就在那里。假设您每次都具有相同的格式,那么我正在检查该行何时更改为新的 baseid 并将该行添加到新的数据表中。从您发布的示例看来,特定 baseid 的最大版本是该 baseid 的最后一行。
-克里斯
【解决方案2】:
我用过
Datatables.Compute() 使用 GROUP By 获取 MAX 值
Function GroupBy(ByVal i_sGroupByColumn As String, ByVal i_sAggregateColumn As String, ByVal i_dSourceTable As DataTable) As DataTable
Dim dv As New DataView(i_dSourceTable)
'getting distinct values for group column
Dim dtGroup As DataTable = dv.ToTable(True, New String() {i_sGroupByColumn})
'adding column for the row count
dtGroup.Columns.Add("Max_Version", GetType(Double))
'looping thru distinct values for the group, counting
For Each dr As DataRow In dtGroup.Rows
dr("Max_Version") = i_dSourceTable.Compute("MAX(" & i_sAggregateColumn & ")", i_sGroupByColumn & " = '" & dr(i_sGroupByColumn) & "'")
Next
'returning grouped/counted result
Return dtGroup
End Function