在 ms Access 中从每个组中选择至少 3 行时出错 - 仅选择了至少 2 行

Posted

技术标签:

【中文标题】在 ms Access 中从每个组中选择至少 3 行时出错 - 仅选择了至少 2 行【英文标题】:Error in Selecting least 3 rows from each group in ms Access - only least 2 rows are getting selected 【发布时间】:2020-10-20 10:06:48 【问题描述】:

我的数据包含 2 列 ID_NO 和 Date_of_arrival。我想为 MS-Access 中的每个 ID 找到至少 3 个 date_of_arrival。我已经编写了代码,除了“11111-00000-11”之外的所有 ID_NO 都可以正常工作,其中它只选择前 2 行。请帮我纠正我的代码以选择 3 个最少 Date_of_arrival 而不是 2。

SELECT a.ID_NO, a.Date_of_arrival
 FROM MainTable a WHERE
 [Date_of_arrival] IN ( SELECT TOP 5 [Date_of_arrival]
 FROM MainTable B WHERE
 a.ID_NO = B.ID_NO
 ORDER BY B.[Date_of_arrival ] ) ORDER BY a.ID_NO, a.[Date_of_arrival];



ID_NO       Date_of_arrival
11111-00000-11  13/11/2019
11111-00000-11  13/11/2019
11111-00000-11  30/12/2019
11111-00000-11  04/02/2020
11111-00000-11  04/02/2020
11111-00000-11  25/02/2020
11111-00000-11  16/03/2020
11111-00000-11  20/03/2020
11111-00000-11  24/04/2020
11111-00000-11  24/04/2020
11111-00000-11  24/04/2020
11111-00000-11  14/05/2020
11111-00000-11  14/05/2020
11111-00000-11  02/01/2019
11111-00000-11  02/01/2019
11111-00000-11  15/02/2019
11111-00000-11  15/02/2019
11111-00000-11  25/04/2019
11111-00000-11  25/04/2019
11111-00000-11  17/05/2019
11111-00000-11  17/05/2019
11111-00000-11  17/05/2019
11111-00000-11  10/06/2019
11111-00000-11  10/06/2019
11111-00000-11  15/07/2019
11111-00000-11  19/08/2019
11111-00000-11  05/09/2019
11111-00000-11  06/09/2019
11111-00000-11  07/10/2019
11111-00000-11  07/10/2019
11111-00000-11  07/10/2019
11111-00000-11  13/11/2019
11111-00000-11  28/05/2020
11111-00000-11  28/05/2020
11111-00000-11  22/06/2020
11111-00000-11  22/06/2020
11111-00000-11  13/07/2020
11111-00000-11  13/07/2020
11111-00000-11  13/07/2020
11111-00000-11  24/07/2020
11111-00000-11  24/07/2020
11111-00000-11  07/09/2020
11111-00001-12  02/01/2019
11111-00001-12  15/02/2019
11111-00001-12  25/03/2019
11111-00001-12  25/04/2019
11111-00001-12  10/06/2019

【问题讨论】:

【参考方案1】:

如果你想要三个不同的值,那么你可以使用:

SELECT a.ID_NO, a.Date_of_arrival
FROM MainTable a
WHERE [Date_of_arrival] IN (SELECT TOP 3 B.[Date_of_arrival]
                            FROM MainTable B
                            WHERE a.ID_NO = B.ID_NO
                            GROUP BY B.[Date_of_arrival ]
                            ORDER BY B.[Date_of_arrival ]
                           )
ORDER BY a.ID_NO, a.[Date_of_arrival];

这将返回重复项,因此对于给定的 ID,您将获得超过 3 行。如果要保证 3 行,则需要额外的列来区分行。假设你有一个主键,我称之为pk

SELECT a.ID_NO, a.Date_of_arrival
FROM MainTable a
WHERE a.pk IN (SELECT TOP 3 pk
               FROM MainTable B WHERE
               WHERE a.ID_NO = B.ID_NO
               ORDER BY B.[Date_of_arrival ]
              )
ORDER BY a.ID_NO, a.[Date_of_arrival];

【讨论】:

添加 group by 子句非常完美。谢谢你。现在我正在为每个 ID 准确获取 3 个最少日期【参考方案2】:

我建议您首先在 Access 中进行查询,按 ID、到达日期和计数分组,计数 >= 3。

SELECT        a.ID_NO
             ,a.Date_of_arrival
             ,count(a.id_no) as CNT
FROM MainTable a 
GROUP BY    a.ID_NO
            ,a.Date_of_arrival
HAVING      count(a.id_no) >= 3

或者

SELECT        a.ID_NO
             ,min(a.Date_of_arrival) as MinDateArrival
             ,max(a.Date_of_arrival) as MaxDateArrival
             ,count(a.id_no) as CNT
FROM MainTable a 
GROUP BY    a.ID_NO                
HAVING      count(a.id_no) >= 3

【讨论】:

我期待的输出是` p1_NART date_of_ud 11111-00000-11 02/01/2019 11111-00000-11 02/01/2019 11111-00000-11 15/02/2019 11111-00000 -11 15/02/2019 11111-00000-11 25/04/2019 11111-00000-11 25/04/2019 ` 我想为每个 ID 选择前 3 个日期。因此,计算 Id_no 会给出不同的结果

以上是关于在 ms Access 中从每个组中选择至少 3 行时出错 - 仅选择了至少 2 行的主要内容,如果未能解决你的问题,请参考以下文章

在 MS Access 中从 .mdf 文件创建数据库

MS Access 2007 重命名自定义组中的快捷方式以更改对象的名称

在 ms Access 数据宏中从另一个表中获取数据

使用联合从 MS Access 表中选择随机记录 [重复]

在 MS Access SQL 查询中从普通日期转换为 unix 纪元日期

如何防止最终用户在 MS Access 2010 应用程序中从前端查看后端数据?