如何在此 DataTable 上按一列分组

Posted

技术标签:

【中文标题】如何在此 DataTable 上按一列分组【英文标题】:How do I GroupBy one column on this DataTable 【发布时间】:2021-10-14 15:46:54 【问题描述】:

假设我有一个通话记录 DataTable,其中每一行代表一个通话,其中包含以下列: AccountNumber1、AccountNumber2、AccountListDate、AccountDisposition

我想要 GroupBy 列 AccountNumber1 并想要一个具有相同列 + 1 个附加列 NumCalls 的新 DataTable,这将是每个 AccountNumber1 的调用计数。

GroupBy 之后的新数据表: AccountNumber1、AccountNumber2、AccountListDate、AccountDisposition、NumCalls

到目前为止,我有以下内容:

table.AsEnumerable()
    .GroupBy(x => x.Field<int>("AccountNumber1"))
    .Select(x => new  x.Key.AccountNumber1, NumCalls = x.Count() )
    .CopyToDataTable()

这给了我一个只有两列 AccountNumber1 和 NumCalls 的 DataTable。如上所述,我如何获得其他列?我将不胜感激任何帮助。谢谢。

【问题讨论】:

您的代码无法编译,因为 Select 重载不存在并且 CopyToDataTable 需要 IEnumerable&lt;DataRow&gt; 作为输入。 另外,如果您只按第一列分组,您想使用哪些行来获取其他列的值? @TimSchmelter 我的错,当我输入示例代码时,我忘记了 Select() 中的新匿名类型声明 【参考方案1】:

没有魔法,您需要使用循环并使用新列初始化新表:

DataTable tblResult = table.Clone();
tblResult.Columns.Add("NumCalls", typeof(int));
var query = table.AsEnumerable().GroupBy(r => r.Field<string>("AccountNumber1"));
foreach (var group in query)

    DataRow newRow = tblResult.Rows.Add();
    DataRow firstOfGroup = group.First();
    newRow.SetField<string>("AccountNumber1", group.Key);
    newRow.SetField<string>("AccountNumber2", firstOfGroup.Field<string>("AccountNumber2"));
    newRow.SetField<DateTime>("AccountListDate", firstOfGroup.Field<DateTime>("AccountListDate"));
    newRow.SetField<string>("AccountDisposition", firstOfGroup.Field<string>("AccountDisposition"));
    newRow.SetField<int>("NumCalls", group.Count());

这从每个组的第一行中获取任意值,这似乎是需要的。

【讨论】:

谢谢!我担心会是这样。希望在 .GroupBy() 之后有一些方法可以用 Linq 快速完成。 @JDSchenck: CopyToDataTable 总是创建一个与输入表(行)具有相同架构/列的新表。但你需要另一列。

以上是关于如何在此 DataTable 上按一列分组的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Hypersql 数据库(HSQLDB)中选择多列但仅按一列分组?

Python:如何按一列分组行并按另一列选择一行?

如何按一列的最大值获取SQL行,按另一列分组

如何比较按一列分组的 SQL 中的列值?

如何按id python按一列顺序对两列进行分组[重复]

Pandas数据框:按一列分组,但由其他列连接和聚合[重复]