【问题标题】: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

提前致谢。

【问题讨论】:

  • 我无法修改查询。(SQL部分)

标签: 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 的最后一行。

-克里斯

【讨论】:

  • 感谢您的回答。我无法修改查询。(SQL 部分)
  • 您提供的解决方案不起作用。很抱歉让你失望了:(
【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 2014-05-28
    • 2013-10-27
    • 1970-01-01
    相关资源
    最近更新 更多