【发布时间】:2021-11-15 10:12:16
【问题描述】:
我总是很难理解 GROUP BY 功能,这个也不例外。
我有一个简单的 Join 查询
Select t1.g1, t1.g2, t2.id, t2.datetime, t3.name
From ((table1 t1 Inner Join table2 t2 on t1.fld1=t2.fld1)
Inner Join table3 t3 on t1.fld2=t3.fld2)
Order By t2.datetime, t2.id
这会按预期返回我的数据。以下是一些示例行,说明了我尝试使用 Group By 检索的内容...
| t1.g1 | t2.g2 | t2.id | t2.datetime | t3.name |
|---|---|---|---|---|
| 726 | 4506 | 32 | 9/12/2021 | nameA |
| 726 | 4506 | 33 | 9/12/2021 | nameB |
| 726 | 4506 | 30 | 9/13/2021 | nameC |
我想仅获取 t1.g1, t1.g2 的每组中的第一行。
所以,我尝试以下方法:
Select t1.g1, t1.g2, FIRST(t2.id), FIRST(t2.datetime), FIRST(t3.name)
From ((table1 t1 Inner Join table2 t2 on t1.fld1=t2.fld1)
Inner Join table3 t3 on t1.fld2=t3.fld2)
Group By t1.g1, t1.g2
Order By FIRST(t2.datetime), FIRST(t2.id)
对于上面的示例组,这将返回以下记录...
| t1.g1 | t2.g2 | t2.id | t2.datetime | t3.name |
|---|---|---|---|---|
| 726 | 4506 | 30 | 9/13/2021 | nameC |
因此,Order By 在分组完成之后运行,而不是之前。或者看起来是这样。可能是 SQL 关键字顺序的原因(Select、From、Where、Group By、Order By)。好的,如果我的假设是正确的,那是有道理的。我认为它发现 t2.id=30 领先于其他 726/4506 记录,因为 t2.id 是 table2 上的主键。
所以,现在我尝试一个嵌套查询,其中我上面的第一个查询以正确的顺序和外部查询组返回数据并获取第一条记录。
Select t1.g1, t1.g2, FIRST(t2.id), FIRST(t2.datetime), FIRST(t3.name)
FROM (
Select t1.g1, t1.g2, t2.id, t2.datetime, t3.name
From ((table1 t1 Inner Join table2 t2 on t1.fld1=t2.fld1)
Inner Join table3 t3 on t1.fld2=t3.fld2)
Order By t2.datetime, t2.id
)
Group By t1.g1, t1.g2
Order By FIRST(t2.datetime), FIRST(t2.id)
同样的结果!我不知道这是怎么发生的。因此,如果有人能阐明在这种情况下 Access SQL 的幕后运作顺序,我很想知道。在我的第二个查询(嵌套选择)中,似乎我正在对目标数据进行排序,以便在对 FIRST() 聚合函数进行分组之后,应该选择在内部结果集中找到的第一行。但这并没有发生。
当然,如果有人能告诉我如何返回我所在的行...
| t1.g1 | t2.g2 | t2.id | t2.datetime | t3.name |
|---|---|---|---|---|
| 726 | 4506 | 32 | 9/12/2021 | nameA |
这就是我真正需要的。
【问题讨论】: