对于按“名称”分组的记录,如何选择(在MSAccess中)与“G”列中值最小的行对应的所有列(A-G)?这是一个示例表
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
谢谢!
答案 0 :(得分: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)
答案 1 :(得分:1)
如果每个G
只有一行具有最小Name
值,或者如果您愿意为{{1}接受多行,则SQL不会太困难当重复最小Name
值时。使用子查询返回每G
的最小G
并将其连接到您的样本表。
Name
然而,即使对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
加上最小ID
的每个组合返回最小Name
。并使用子查询的G
和最小Name
加入样本表。
ID
我在Access 2007中测试了两个查询,并将样本数据保存在名为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);
的表中。两者都返回了你要求的结果集。
注意我在第二个查询中使用SampleTable
将CLng()
返回的值转换为DMin()
。如果没有Long
,则CLng()
值将返回为MinOfG
,这在联接中不起作用。