首页 > 解决方案 > 在 ms Access 中从每个组中选择至少 3 行时出错 - 仅选择了至少 2 行

问题描述

我有包含 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

标签: sqlgroup-byms-access-2016top-n

解决方案


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

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];

推荐阅读