【发布时间】:2017-01-19 22:21:24
【问题描述】:
我会尽力解释我的问题及其背后的数据。
我在 Microsoft Access 中有一个表,其结构如下。
ID1、ID2、数据1、数据2
ID1 - 是标识项目的数字字段(1、2、3、4 等...)
ID2 - 是一个数字字段,用于标识该项目的更改(1、2、3、4 等...) 这些都设置了主键。需要这两个 ID 才能使记录唯一。
Data1 - 包含更改信息的数据字段(进行更改的用户的名称)
Data2 - 同样的东西,只是一个数据字段。
我需要对此数据运行 SQL 查询以返回 Data1 中特定项目的所有记录,其中 ID1 = 假设为 1,ID2 = 该集合中的最新记录。
ID2 的最后一行可能会有所不同。因此,如果 ID1 为 1,则该 ID1 可能有 7 个 ID2,所以 7 将是我需要检查的行。其中 ID1 等于 2,可能有 3 个项目,所以现在我需要 SQL 检查第 7 行的 ID1=1 和第 3 行的 ID1=2 以确定该行中的 Data1 是否等于某个名称。
从我能够研究的情况来看,我似乎需要使用分组来将 ID1 放在一起,但我找不到我正在寻找的东西是从 ID2 中获取最大项目对于每组 ID1。
这是我目前所处的位置。
SELECT ID1, Max(ID2), Data1, Data2
FROM tbl_History
WHERE Data1 = 'name'
GROUP BY ID1
ORDER BY ID2 DESC
示例数据:
ID1 | ID2 | Data1 | Data2
--------------------------------
1 1 Name1 32
1 2 Name2 23
1 3 Name3 63
1 4 Name2 53
2 1 Name4 12
2 2 Name5 16
2 3 Name2 71
预期结果是,如果我从 Data1 中查找 Name2,我将获得第 1-4 行和第 2-3 行。如果我在此示例中查找 Name5 或除 2 之外的任何其他名称,我将不会收到任何行,因为没有最大 ID2 的名称是 Data1 列。
返回的错误是 Data2 不是聚合函数的一部分。从技术上讲,我已经拥有 Data1,因此我可以将其从返回的数据中取出,但如何根据上述要求检索 Data2。也许分组不是我需要走的路。
我正在使用 VB.NET 通过 OleDb 连接访问 Microsoft Access 数据库。
任何帮助将不胜感激。如果需要任何进一步的细节,请告诉我,我很乐意发布。
【问题讨论】:
-
一般的 GROUP BY 规则说:如果指定了 GROUP BY 子句,则 SELECT 列表中的每个列引用必须要么标识一个分组列,要么是一个集合函数的参数!
-
很好,但是如果是日期、文本或数字,我应该使用什么函数从 Data2 中检索数据。这就是为什么我觉得分组不是要走的路。
-
添加一些示例表数据和预期结果。 (以及格式化文本。)
-
我添加了一些示例数据和预期的结果。
-
无需再花时间在这上面。戈登的回答完美。我只是在第一次尝试时就搞砸了。感谢您的时间 jarlh,我很感激。