МС Доступ. Запишите положение наибольшего числа в группе столбцов

Заранее извиняюсь, я новичок в том, чтобы просить о помощи, но я долго боролся с этим.

У меня есть таблица MS Access, в которой хранится много информации в столбцах. Мне нужно иметь возможность записывать, в какой позиции появляется наибольшее число в каждом столбце, в новой таблице или запросе. NB: в таблице более 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

Мне нужна новая таблица или запрос, который сообщает мне, в какой позиции находится наибольшее число? Результирующая таблица будет выглядеть так. Где наибольшее число столбца 1 находится в позиции 3, наибольшее число столбца 2 — в позиции 5, наибольшее число столбца 3 — в позиции 1 и так далее.

Col1R Col2R Col3R Col4R
3 5 1 4

Будем очень признательны за любую помощь или направление в VBA, SQL или Query. (у меня MS Access 2016)

Спасибо всем за ваши быстрые и отличные ответы, теперь я попробовал ваши решения, и сначала они работают нормально, однако, когда вы добавляете больше данных, они возвращают неверные результаты. Я должен был предоставить больше информации для начала, но просто хотел, чтобы это было просто.

По какой-то причине я не могу редактировать таблицы или правильно добавлять новые таблицы для отображения расширенной информации.

пожалуйста, взгляните на эти 2 изображения для новой информации о таблице и результатов, спасибо всем заранее. информация о таблице 1 введите здесь описание изображения


person Rod Parker    schedule 27.07.2021    source источник
comment
Кажется, вам нужен перекрестный запрос для получения сводных данных. docs.microsoft.com/en-us/office/client-developer/access/.   -  person Tim    schedule 27.07.2021
comment
Вы импортируете таблицу с помощью SQL и VBA?   -  person Rezu    schedule 27.07.2021
comment
Сколько записей задействовано? Могут ли значения повторяться в столбце? Если да, то какую должность вы бы хотели?   -  person June7    schedule 27.07.2021
comment
SQL или VBA, не имеет значения, у меня тоже работает. Записей = 200 тыс.+, повторение чисел не должно иметь особого значения, все числа до 6 разрядов. Спасибо всем, сейчас я работаю над некоторыми ответами.   -  person Rod Parker    schedule 27.07.2021
comment
Я пробовал все ответы, и сначала казалось, что все работает хорошо, однако, когда я добавляю больше данных, я получаю неправильные результаты.   -  person Rod Parker    schedule 27.07.2021


Ответы (3)


Вот интересный ответ. Написано на sql server, с доступом не знаком, но думаю можно попробовать так же.

Предположим, у вас менее 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 Access.

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
person AIMIN PAN    schedule 27.07.2021
comment
Это работает. А если записей больше 1000? - person June7; 27.07.2021
comment
ну это просто. max (CInt (Col1 * 100) * MAX_ROWS_POSSIBLE) + позиция) mod MAX_ROWS_POSSIBLE - person AIMIN PAN; 27.07.2021
comment
Итак, вы действительно имели в виду менее 10 000 строк в своем описании ответа? - person June7; 27.07.2021
comment
о да, это должно быть Предположим, у вас менее 10 000 строк. это опечатка. - person AIMIN PAN; 27.07.2021
comment
Это очень умное и креативное решение. - person Gustav; 27.07.2021

Один из вариантов включает агрегатные функции домена.

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;

Это также возможно с коррелированными вложенными запросами, но это сжигает мой мозг, думая об этом. Я позволю вам изучить эту возможность. Начните с обзора Найдите макс. значение и показать соответствующее значение из другого поля в 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 вычисляемыми значениями и большим количеством записей.

person June7    schedule 27.07.2021
comment
Большое спасибо, ваша «агрегатная функция домена» работает отлично. Я буду придерживаться SQL, так как изначально он работает немного быстрее, чем VBA. Навсегда благодарен всем, кто помог. - person Rod Parker; 27.07.2021
comment
Предлагаем вам попробовать подход в другом ответе также для сравнения. Я впечатлен, никогда бы не подумал об этом. - person June7; 27.07.2021

Я бы сделал это с подзапросами в операторе 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 столбцов, как вы говорите, это немного больше, чем копирование и вставка, чтобы получить результат.

person Spencer Barnes    schedule 27.07.2021
comment
Кажется, я не могу заставить это работать, я получаю сообщение об ошибке, не могу иметь агрегатную функцию в предложении WHERE. - person Rod Parker; 27.07.2021
comment
Вы правы, я забыл, что вам придется выполнять агрегацию в предложении FROM. Обновленный ответ в соответствии с требованиями. - person Spencer Barnes; 27.07.2021