Фильтрация DataTable в VB.Net - PullRequest
       3

Фильтрация DataTable в VB.Net

3 голосов
/ 28 сентября 2011

У меня есть таблица данных со следующей структурой.

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

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 28 сентября 2011

Зависит от того, насколько заполнены ваши исходные данные. если вы делаете это с помощью запроса к базе данных, я бы отформатировал результирующий набор в самом запросе примерно так:

(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

Теперь синтаксис может быть выключен здесь или там (написал это в notpad), но идея логики есть. Предполагая, что у вас один и тот же формат каждый раз, я проверяю, когда строка меняется на новый baseid, и добавляю эту строку в новую таблицу данных. из приведенного вами примера видно, что максимальная версия конкретного baseid - это последняя строка этого baseid.

-Крис

0 голосов
/ 29 сентября 2011

Я использовал

Datatables.Compute () для получения значения MAX с помощью GROUP By

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...