按结果分组,顺序相同

时间:2016-08-01 11:50:03

标签: c# sql linq

我对结果集进行分组时遇到问题。

我需要将Tab_1_colName上的结果和Tab_2_Order的结果顺序(不同部分)分组,如果它们具有相同的Tab_2_Ids

所以我有第一个结果集,如下所示:

  Tab_1_colName Tab_2_colName   Tab_2_Id    Tab_2_Order
    Name_1          Type_1          16          10
    Name_1          Type_2          17          20
    Name_1          Type_3          18          30
    Name_2          Type_1          16          10
    Name_2          Type_2          17          20
    Name_2          Type_3          18          30
    Name_3          Type_1          16          400
    Name_3          Type_2          17          500
    Name_3          Type_3          18          600
    Name_4          Type_1          16          10
    Name_4          Type_3          18          20
    Name_4          Type_2          17          30

我需要的结果如下:

Group1 => (Name_1 - Name_3) with the IDs in this order (16, 17, 18),
Group2 => (Name_4) with the IDs in this order (16, 18, 17)

我没有想到如何实现这个目标。我试图将它直接分组在数据库上,但我坚持

SELECT 
    Tab_1_colName, Tab_2_Id
FROM 
    Tab_1,
    Tab_2
WHERE
    Tab_1_othderID = Tab_2_othderID
group by 
    Tab_2_Id, Tab_1_colName

我的第二个想法是尝试使用linq,但是我的问题就像使用纯sql一样快速尝试

dt.Rows.OfType<DataRow>().OrderBy(x => x["Tab_2_Order"]).GroupBy(r => r["Tab_2_Id"])

任何想法如何解决我的问题?

编辑:

预期结果:

第一行:Name_1,其中Tab_2_Ids顺序为tab_2_order。

第二行:Name_4,Tab_2_Ids顺序为tab_2_order。

(Name_2和Name_3应该与Name_1在同一个组中,因为它们在相同的顺序中具有相同的Tab_2_Ids)

2 个答案:

答案 0 :(得分:0)

你不使用聚合功能,所以你不需要通过.. 而是使用disticnt选择不同的值和/或order by来排序结果,例如:

 SELECT distinct 
  Tab_1_colName, Tab_2_Id
FROM 
  Tab_1,
  Tab_2
WHERE
Tab_1_othderID = Tab_2_othderID
order by 
   Tab_2_Id, Tab_1_colName

答案 1 :(得分:0)

解决了我的问题。在另一个用户的帮助下,不幸的是在我运行它之前删除了他的anwser。 :(

非常感谢你! :)

无论如何,这是我的解决方案:

var dtRows = dt.Rows.OfType<DataRow>();

var rows = dtRows.GroupBy(r =>
            String.Join(",", dtRows.Where(q => q[0] == r[0]).OrderBy(o => o[3]).Select(s => s[0]).ToArray()),
            x => x[2],
            (key, g) => new Tuple<string, string[]>(key, g.Where(s => s != null).Select(s => s.ToString()).ToArray().Distinct().ToArray())
          ).ToList();

List<Tuple<string, string[], List<string>>> rowsToWrite = new List<Tuple<string, string[], List<string>>>();

foreach (var row in rows)
{
    if (!rowsToWrite.Any(x => x.Item2.SequenceEqual(row.Item2)))
        rowsToWrite.Add(Tuple.Create(row.Item1, row.Item2, new List<string>()));
    else
        rowsToWrite.Select(x => x).Where(x => x.Item2.SequenceEqual(row.Item2)).First().Item3.Add(row.Item1);
}