如何解决微软访问记录一堆列中最高数字的位置
我提前道歉,我刚开始寻求帮助,但我已经为此苦苦挣扎了很长时间。
我有一个 MS Access 表,它在列中存储了大量信息。我需要能够记录最高数字出现在每列、新表或查询中的哪个位置。注意:该表有 40 多列,因此使用“按最大值排序”的单个查询对我不起作用。
表格的简化版本会是这样; 表1
位置 | 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 张图片,提前谢谢大家。
解决方法
这是一个有趣的答案。用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,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
,
一个选项涉及域聚合函数。
SELECT DISTINCT DLookUp("Position","Table3","Col1=" & DMax("Col1","Table3")) AS C1,DLookUp("Position","Col2=" & DMax("Col2","Table3")) AS C2,"Col3=" & DMax("Col3","Table3")) AS C3,"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 个计算值和大量记录,这些选项中的任何一个都可能执行缓慢。
,我会在 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 列,也只需复制粘贴即可获得结果。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。