微软访问。记录一堆列中最高数字的位置

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 子句中进行聚合。更新了适合的答案。

以上是关于微软访问。记录一堆列中最高数字的位置的主要内容,如果未能解决你的问题,请参考以下文章

Python:查找数组中元素的位置

Excel搜索Word是否在列A中的某个位置以及列B中

访问 VBA:在列中查找最大数并加 1

根据另一列的顺序制作一列

Python数据分析的过程记录

pandas - 提取具有不同位置的不同字符集之间的数字