2012-02-01 27 views
0

我使用SqlDataAdapter和填充方法從SQL數據庫導入了DataTable將DataTable中的多個重複值排序爲一行

我的數據表如下所示:

Timestamp(unix time) | Value

  x   | 10 
      x   | 42 
      x   | 643 
      y   |  5 
      y   |  9 
      y   | 70 

...等等。該表包含很多值(1000+),但始終有三行具有相同的時間戳。

現在我希望它看起來像這樣:

Timestamp(unix time) | Value 1 | Value 2 | Value 3

 x    | 10 | 42 | 643 
     y    | 5 |  9 | 70 

我怎麼能這樣排序呢?

(如果有三個以上的值時,PROGRAMM應該只是插入它已經找到了前三個值)

感謝您的幫助!

回答

1

感謝您的方法!我現在自己解決了。

這是多麼我已經做到了:

var grouped = from myRow in myDataTable.AsEnumerable() 
       group myRow by myRow.Field<int>("TIMESTAMP"); 

foreach (var timestamp in grouped) 
{ 
    string[] myRow = new string[5]; 
    myRow[0] = timestamp.Key.ToString(); 

    int i = 1; 
    foreach (var value in timestamp) 
    { 
     myRow[i] = value.Field<double>("VALUE").ToString(); 
     i++; 
     if (i > 4) 
      break; 
    } 

    mySortedTable.Rows.Add(myRow); 
} 
0

我想這也可能是在SQL解決的,但如果你想以編程方式做到這一點,我已經測試在LinqPad如下:

void Main() 
{ 
    var list = new List<Tuple<string,int>> { 
     Tuple.Create("x", 10), 
     Tuple.Create("x", 42), 
     Tuple.Create("x", 643), 
     Tuple.Create("y", 5), 
     Tuple.Create("y", 9), 
     Tuple.Create("y", 70), 
    }; 

    var result = 
    from grp in list.GroupBy(t => t.Item1) 
    let firstThree = grp.Select(t => t.Item2).Take(3).ToList() 
    select new { 
      Key = grp.Key, 
      Value1 = firstThree[0], 
      Value2 = firstThree[1], 
      Value3 = firstThree[2] }; 

    foreach (var item in result) 
     Console.WriteLine(item); 
} 

它假定你有至少三個要素,否則你會得到一個超出範圍的例外。

雖然最終結果是匿名類型,但您可以輕鬆地將操作結果傳遞到DataRow中。

+0

謝謝您的回答!我編輯了我的問題:我的例子應該只是一個超過1000個值的大表的摘錄。可以在SQL中解決嗎?會很棒,但是我還沒有在SQL中做任何事情(也許有人可以發佈一個方法,我會在稍後嘗試) – Blubb 2012-02-01 09:52:54

+1

Flq,一個改進:'字典<字符串,列表>結果= 列表 .GroupBy (a => a.Item1) .ToDictionary( x => x.Key, y => y.Select(z => z.Item2).ToList() ); ' – 2012-02-01 11:44:40

相關問題