1

对于按“名称”分组的记录,如何选择(在 MSAccess 中)与“G”列中具有最小值的行对应的所有列 (AG)?这是一个示例表

ID Name A   B   C   D   E   F   G
1 CHRIS 30  -99 -99 0   0   0   239
2 CHRIS 30  -99 -99 0   0   0   233
3 CHRIS 30  -99 -99 0   0   0   120
4 CHRIS 30  -99 -99 0   0   0   41
5 CHRIS 40  1012    130 20  20  0   55
6 KEITH 55  1012    230 175 150 50  178
7 KEITH 55  1012    250 125 175 100 22
8 KEITH 35  1012    270 25  25  0   76
9 KEITH 40  1012    320 100 100 0   90

结果将是:

CHRIS   30  -99 -99 0   0   0   41

KEITH   55  1012    250 125 175 100 22

谢谢!

4

2 回答 2

3

看看这是否会引导你朝着正确的方向前进。如果您有一个 UserId 而不是名称来 JOIN 会更好,因为您不希望最终在连接中出现重复项。

SELECT
    Table1.Name 
    , Table1.A
    , Table1.B
    , Table1.G
FROM
    Table1 
INNER JOIN Table1 as Table2 ON Table2.Name = Table1.Name
GROUP BY Table1.Name , Table1.A, Table1.B, Table1.G
HAVING Table1.G = MIN(Table2.G)
于 2012-12-20T22:31:02.233 回答
1

G如果每个的最小值只有一行,或者当最小值重复时Name您愿意为 a 接受多于一行,则 SQL 并不太难。使用返回最小值的子查询并将其连接到您的示例表。NameGGName

SELECT
    smp.Name,
    smp.A,
    smp.B,
    smp.C,
    smp.D,
    smp.E,
    smp.F,
    smp.G
FROM
    SampleTable AS smp
    INNER JOIN (
        SELECT
            [Name],
            Min(G) AS MinOfG
        FROM SampleTable
        GROUP BY [Name]
    ) AS sub
    ON
            (smp.Name = sub.Name)
        AND (smp.G = sub.MinOfG);

但是,如果您只需要一行,Name即使G重复最小值,它也会更具挑战性Name。在这种情况下,您可以包含另一个子查询级别,该级别返回每个plus minimumID组合的最小值。并使用子查询和最小值加入您的示例表。NameGNameID

SELECT
    smp.Name,
    smp.A,
    smp.B,
    smp.C,
    smp.D,
    smp.E,
    smp.F,
    smp.G
FROM
    SampleTable AS smp
    INNER JOIN (
        SELECT
            sub1.Name,
            CLng(
                DMin(
                    "ID",
                    "SampleTable",
                    "[Name]='" & [sub1].[Name]
                        & "' AND G=" & [sub1].[MinOfG]
                    )
                ) AS MinOfID
        FROM
            (
                SELECT
                    [Name],
                    Min(G) AS MinOfG
                FROM SampleTable
                GROUP BY [Name]
            ) AS sub1
    ) AS sub2
    ON
            (smp.Name = sub2.Name)
        AND (smp.ID = sub2.MinOfID);

我在 Access 2007 中测试了这两个查询,您的示例数据保存在名为SampleTable. 两者都返回了您要求的结果集。

注意我CLng()在第二个查询中使用了DMin()as的返回值Long。如果没有CLng()MinOfG则返回的值String在连接中不起作用。

于 2012-12-21T03:50:57.890 回答