2

我有一张桌子:

Group | BasalArea | SpeciesName
1     | 3.6       | Palustris
1     | 45.0      | MSO
2     | 4.2       | Oak
2     | 2.0       | MSO
...

从这张表中,我想得到由 Group 字段分组的具有最高基底面积的物种名称,如下所示:

Group | BasalArea | SpeciesName
1     | 45.0      | MSO
2     | 4.2       | Oak

使用 SQL,我可以获得最高的基底面积:

SELECT Group, Max(BasalArea)
FROM TABLE
GROUP BY Group

我不知道如何在不做一些循环的情况下获得物种名称。这可能吗?处理关系的策略是什么?

4

3 回答 3

4

这在 LINQ2SQL 中比在 SQL 中更简单:

var res = source.MyTable
    .GroupBy(item => item.Group)
    .Select(g => g.OrderByDescending(item => item.BasalArea).First())
    .ToList();

BasalArea这将返回其中具有最大值的项目列表Group,以及SpeciesName

在 SQL 中,您需要连接回原始表,如下所示:

SELECT * FROM TABLE b
JOIN (
    SELECT Group, Max(BasalArea) as BasalArea
    FROM TABLE
    GROUP BY Group
) t on t.Group = b.Group AND t.BasalArea = b.BasalArea
于 2012-11-30T19:07:04.413 回答
2

试试这个:

var froup = categories.GroupBy(g => new {g.CategoryType})
                          .Select(g => g.OrderByDescending(i => i.CategoryID).First())
                          .ToArray();
于 2012-11-30T19:14:51.283 回答
1

sasblinkenlight 说的是 LINQ。出于好奇,这里有一个潜在的 SQL 解决方案。

SELECT grouped.Group, raw.SpeciesName, grouped.MaBasalArea
FROM (
        SELECT Group, MAX(BasalArea) as MaxBasalArea
        FROM TABLE
        GROUP BY Group
     ) grouped
INNER JOIN TABLE raw ON grouped.MaxBasalArea = raw.BasalArea AND grouped.Group = raw.Group
于 2012-11-30T19:14:16.463 回答