タイトルがわかりにくいかもしれないので、簡単に説明します: メソッドを作成する必要があります:
MergeDataset (byval ds as Dataset) をデータセットとして
- データテーブルに複数の行があります
- 列: startDate、endDate、その他複数
データセットは startDate で並べ替えられます
私が今していること:
- もちろん空のデータセットのクローンを作成します
データテーブルのすべてのデータ行をループします
データ行がすべての列 (開始日と終了日を除く) と等しいクローン データセットの値を持ち、クローンの終了日がデータ行の開始日 - 1 日と等しい場合
それ以外の場合、行はクローンに追加されます
これは正しく行われるようになりましたが、多くの時間がかかります。100,000 行のデータセットがある場合、すべてをマージするには数時間かかります。
ここにいくつかのコード:
Dim mergeSet As DataSet = dsSubscriptions.Clone()
Dim dr() As DataRow = ds.Tables("resultTable").Select("","startDate")
For Each sourceRow As DataRow In dr
If mergeSet.Tables("resultTable").Rows.Count > 0 Then
Dim foundRows As DataRow() = mergeSet.Tables("resultTable").Select(endDate=startDate-1 and value1 = value1 and value2 = value2 and value3 = value3)
'If nothing in foundRows -> Add row
For Each resultrow As DataRow In foundRows
resultrow("endDate") = CDate(sourceRow("endDate"))
next
else
'Add row
Next
タイムスパンを確認すると、mergeSet の選択で多くの時間が失われ、大幅に増加しています。選択には 5 つの一意の値があり、すべての値が互いに等しい場合は行をマージでき、日付は 1 つの期間にマージできます。
小さな例:
ID 開始日 終了日 値1 値2 値3
1 2012 年 11 月 11 日 2012 年 11 月 30 日 ABC マージに追加
2 2012 年 1 月 12 日 2012 年 12 月 31 日 ABC 1 とマージ
3 2013 年 1 月 1 日 2013 年 1 月 31 日 ABB マージに追加 (2 と同じ値ではありません)
どんな助けでも大歓迎です!敬具