在 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 2007 重命名自定义组中的快捷方式以更改对象的名称