MS Access - 通过聚合函数进行选择

Posted

技术标签:

【中文标题】MS Access - 通过聚合函数进行选择【英文标题】:MS Access - Selecting via an aggregate function 【发布时间】:2018-09-12 10:55:10 【问题描述】:

我有下表。我想做两件事: 我想为拥有多个活动条目的所有人员选择所有行。

PersonName  Address Active  DateUpdated
Adam    Paris   False   09/08/2018
Adam    Dubai   True    17/02/2018
Brendan New York    False   17/02/2018
John    Dublin  True    17/02/2018
John    London  True    09/02/2018
Mike    Miami   False   10/02/2018
Mike    Singapore   False   01/02/2018
Mike    New York    True    01/03/2018
Susan   Los Angeles True    19/02/2018
Susan   Las Vegas   True    17/01/2018
Zara    Berlin  True    05/09/2018
Zara    Madrid  True    12/07/2018
Zara    Houston False   12/09/2018

查询:

select PersonName,Count(PersonName)
from tempTableTest where Active=True
group by PersonName

给予

PersonName  Expr1001
Adam    1
John    2
Mike    1
Susan   2
Zara    2

所以我的结果表应该包含 PersonName=John、Susan 或 Zara 的所有行(因为每个行都有多个 Active=True 的条目)。我希望它看起来像这样-

PersonName  Address DateUpdated Active
John    London  09/02/2018  True
John    Dublin  17/02/2018  True
Susan   Las Vegas   17/01/2018  True
Susan   Los Angeles 19/02/2018  True
Zara    Berlin  05/09/2018  True
Zara    Madrid  12/07/2018  True
Zara    Houston 12/09/2018  False

如果有意义的话,我还想更新 Active=False where DateUpdatedMax(DateUpdated)。 所以对于约翰来说,09/02/2018 的行应该设置为 False(因为有一个 17/02/2018) 对于 Susan 17/01/2018,行应设置为 False 而 Zara 的 05/09/2018 和 12/07/2018 应该设置为 False。

有人可以帮忙吗? (将不胜感激,在此先感谢!)。

【问题讨论】:

哦,不,桌子还没有出来,我在这里期望如何。也许我可以转发它 哇,非常感谢,这真的很快,很有帮助,而且非常有用。 【参考方案1】:

尝试加入一个子查询,该子查询仅限于具有多个活动条目的匹配名称:

SELECT t1.*
FROM tempTableTest t1
INNER JOIN
(
    SELECT PersonName
    FROM tempTableTest
    WHERE Active = True
    GROUP BY PersonName
    HAVING COUNT(*) > 1
) t2
    ON t1.PersonName = t2.PersonName

【讨论】:

【参考方案2】:

你可以使用EXISTS

SELECT t.*
FROM tempTableTest t
WHERE EXISTS (SELECT 1 
              FROM tempTableTest t1 
              WHERE t1.PersonName = t.PersonName AND t1.Active = True AND t1.Address <> t.Address
             );

【讨论】:

【参考方案3】:

您可以使用EXISTS 子句来测试是否存在特定条件:

SELECT t.*
FROM tempTableTest t
WHERE EXISTS(
      SELECT 1 
      FROM tempTableTest s 
      WHERE s.Active=True AND s.PersonName = t.PersonName
      GROUP BY PersonName 
      HAVING Count(*) > 1
)

【讨论】:

【参考方案4】:

这是一个更新查询。

UPDATE 
    t52293469 AS T 
SET 
    T.Active = False, T.PersonName = "a", T.DateUpdated = Now()
WHERE 
(
    ((T.Active)=True) 
    AND ((Exists (SELECT 1 
                  FROM t52293469 t1 
                  WHERE t1.PersonName = t.PersonName AND t1.Active = True AND t1.DateUpdated >t.DateUpdated
    ))=True)
);

这会更新 John、Susan 和 Zara

【讨论】:

非常感谢。除了应该将 Zara 的两个 TRUE 值都设置为 false(请注意,Zara 的最新条目已经是 False,因此所有值都应该设置为 False)之外,这还有效。换句话说,更新应该将每个用户的所有早于 Max(DateUpdated) 的所有内容设置为按用户名分组的 False ...如果有意义的话.. 更新 tempTableTest AS T SET T.Active = False, T.DateUpdated = Now() WHERE ( 存在 (SELECT 1 FROM tempTableTest t1 WHERE t1.PersonName = t.PersonName AND t1.DateUpdated >t. DateUpdated ) =True)

以上是关于MS Access - 通过聚合函数进行选择的主要内容,如果未能解决你的问题,请参考以下文章

MS Access 选择不同的随机值

PCB MS SQL CLR聚合函数(函数作用,调用顺序,调用次数) CLR说明

MS Access Sql 查询不是聚合函数的一部分。使用计数功能

MS Access/SQL 子查询的语法,包括聚合函数

您的查询不包含表达式“未结金额”作为聚合函数的一部分 - MS Access

MS Access SQL 转换对枢轴值的聚合操作