微软访问。记录一堆列中最高数字的位置
Posted
技术标签:
【中文标题】微软访问。记录一堆列中最高数字的位置【英文标题】:MS Access. Record the position of the highest number in a bunch of columns 【发布时间】:2021-10-02 22:47:59 【问题描述】:提前道歉,我是新来寻求帮助的人,但我已经为此苦苦挣扎了很长时间。
我有一个 MS Access 表,它在列中存储了大量信息。我需要能够记录新表或查询中每列中最高数字出现的位置。注意:该表有超过 40 列,因此带有“最大排序”的单个查询对我不起作用。
表格的简化版本是这样的; 表1
Position | Col1 | Col2 | Col3 | Col4 |
---|---|---|---|---|
1 | 0.1 | 0.5 | 0.8 | 0.3 |
2 | 0.5 | 0.7 | 0.1 | 0.5 |
3 | 0.7 | 0.6 | 0.2 | 0.7 |
4 | 0.2 | 0.1 | 0.5 | 0.8 |
5 | 0.3 | 0.8 | 0.4 | 0.2 |
6 | 0.6 | 0.3 | 0.3 | 0.4 |
我需要一个新表或查询来告诉我最高数字的位置是什么? 结果表将如下所示。其中 Col1 的最大数字在位置 3,Col2 的最大数字在位置 5,Col3 的最大数字在位置 1,依此类推。
Col1R | Col2R | Col3R | Col4R |
---|---|---|---|
3 | 5 | 1 | 4 |
任何有关 VBA、SQL 或查询的帮助或指导将不胜感激。 (我使用的是 MS Access 2016)
感谢大家的及时和出色的答复,我现在已经尝试了您的解决方案,起初它们工作正常,但是当您添加更多数据时,它们返回错误的结果。 我应该提供更多信息才能开始,但只是想保持简单。
由于某些原因,我无法编辑表格或正确添加新表格以显示扩展信息。
请看一下新表信息和结果的 2 张图片,谢谢你。
【问题讨论】:
您似乎想要一个交叉表查询来获取透视数据。 docs.microsoft.com/en-us/office/client-developer/access/…. 你用SQL和VBA导入表吗? 涉及多少条记录?值可以在列中重复吗?如果是,你想要哪个职位? SQL 或 VBA,没关系,对我有用。记录 = 200k+,重复的数字并不重要,所有数字都是 6 dec 位。感谢到目前为止的所有人,我现在正在解决一些答案。 我已经尝试了所有的回答,起初似乎一切正常,但是当我添加更多数据时,我得到了不正确的结果。 【参考方案1】:这是一个有趣的答案。用sql server写的,我对access不熟悉,不过我觉得你可以试试同样的方法。
假设您的行数少于 1000。
select
max(convert(int, Col1 * 100) * 10000 + Position) % 10000 as Col1R,
max(convert(int, Col2 * 100) * 10000 + Position) % 10000 as Col2R,
max(convert(int, Col3 * 100) * 10000 + Position) % 10000 as Col3R
from T
好的,ms 访问版本。
SELECT
max ( CInt( Col1 * 100) * 10000 + Position ) mod 10000 ,
max ( CInt( Col2 * 100) * 10000 + Position ) mod 10000 ,
max ( CInt( Col3 * 100) * 10000 + Position ) mod 10000
FROM T
【讨论】:
确实有效。如果有超过 1000 条记录? 这很简单。最大值 (CInt (Col1 * 100) * MAX_ROWS_POSSIBLE) + 位置) mod MAX_ROWS_POSSIBLE 那么,您在回答叙述中的真正意思是“少于 10,000 行”吗? 哦,是的,它应该是假设您的行数少于 10,000。这是一个拼写错误。 这是一个非常聪明和有创意的解决方案。【参考方案2】:一个选项涉及域聚合函数。
SELECT DISTINCT DLookUp("Position","Table3","Col1=" & DMax("Col1","Table3")) AS C1,
DLookUp("Position","Table3","Col2=" & DMax("Col2","Table3")) AS C2,
DLookUp("Position","Table3","Col3=" & DMax("Col3","Table3")) AS C3,
DLookUp("Position","Table3","Col4=" & DMax("Col4","Table3")) AS C4
FROM Table3;
这对于相关的嵌套查询也可能是可能的,但它让我的大脑思考它。我会让你探索这种可能性。从评论Find max value and show corresponding value from different field in MS Access开始
另一个选项涉及 VBA 自定义函数。它要么使用上面的域聚合表达式,要么打开一个记录集对象。
Function GetMaxPos(strCol As String)
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset("SELECT Position, " & strCol & " FROM Table3 ORDER BY " & strCol & " DESC")
GetMaxPos = rs!Position
End Function
从查询或文本框中调用函数。
SELECT DISTINCT GetMaxPos("Col1") AS C1,
GetMaxPos("Col2") AS C2,
GetMaxPos("Col3") AS C3,
GetMaxPos("Col4") AS C4
FROM Table3;
如果有 40 个计算值和大量记录,这些选项中的任何一个都可能执行缓慢。
【讨论】:
非常感谢,您的“域聚合函数”运行良好。我会坚持使用 SQL,因为它本身比 VBA 快一点。永远感激所有提供帮助的人。 建议您尝试其他答案中的方法来进行比较。我印象深刻,从来没有想过。【参考方案3】:我会在 SELECT 语句中使用子查询,如下所示:
SELECT
(SELECT T.Position From Table1 T Where T.Col1 = Agg.Max1) AS Pos1,
(SELECT T.Position From Table1 T Where T.Col2 = Agg.Max2) AS Pos2,
(SELECT T.Position From Table1 T Where T.Col3 = Agg.Max3) AS Pos3,
(SELECT T.Position From Table1 T Where T.Col4 = Agg.Max4) AS Pos4
FROM
(SELECT Max(T1.Col1) AS Max1, Max(T1.Col2) AS Max2, Max(T1.Col3) AS Max3, Max(T1.Col4) AS Max4
FROM Table1 T1) AS Agg
我认为这并不比这里的其他解决方案罗嗦得多,我发现它更容易略读和理解,而且它肯定会比 VBA 更快地工作。即使是你所说的 40 列,也不过是一点点复制粘贴就可以得到结果。
【讨论】:
我似乎无法让它工作,我收到一个错误,“在 WHERE 子句中不能有聚合函数”。 你说得对,我忘了你必须在 FROM 子句中进行聚合。更新了适合的答案。以上是关于微软访问。记录一堆列中最高数字的位置的主要内容,如果未能解决你的问题,请参考以下文章