我有一个具有以下结构的数据表。
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
提前致谢。
答案 0 :(得分:2)
这取决于您填充原始数据表的方式。如果你是通过查询数据库来做的,我会在查询本身格式化结果集,如:
(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
这会在将数据放入数据表之前格式化数据。
如果数据表由其他方法填充,您需要对其进行过滤,然后将其放入antoher数据表中。然后一个简单的方法(假设你的数据表总是以上述方式排序)是:
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
现在语法可能在这里或那里(在notpad中写下)但是逻辑的概念就在那里。假设每次都有相同的格式,那么我正在检查行何时更改为新的baseid并将该行添加到新的数据表中。从您发布的示例看来,特定baseid的最大版本是该baseid的最后一行。
-Chris
答案 1 :(得分:0)
我用过
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