powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Максимум из значений в строке(диапазона значений в строке)
25 сообщений из 29, страница 1 из 2
Максимум из значений в строке(диапазона значений в строке)
    #39771597
mikle08es2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Есть запрос, результатом которого является таблица см рисунок.
Заголовки столбцов:
Дни месяца
Рабочие дни,
Код предприятия,
Кол-во,
HOUR1- электропотребление в первый час суток
....
HOUR24- электропотребление в последний час суток


Необходимо последним столбцом посчитать максимальное потребление из диапазона MAX(HOUR1:HOUR24)
1)за каждые сутки
2) только за рабочие сутки


Неужели в Access нет функции расчета максимума из строчного диапазона?
Весь день думаю, никак. За любые идеи заранее спасибо.
...
Рейтинг: 0 / 0
Максимум из значений в строке(диапазона значений в строке)
    #39771621
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikle08es2,
А в каком виде (как выглядит таблица) Вы храните данные?
Что означает поле "count" (хорошее имя для поля)?
...
Рейтинг: 0 / 0
Максимум из значений в строке(диапазона значений в строке)
    #39771631
mikle08es2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sdku,
Данные хранятся в виде таблицы
Столбцы которой
Дата
код предприятия
количество получасовых значений электропотребления(Count)
h1 -значения электропотребления за первые полчаса суток
.....
h48

Собственно запросом получил то, что было в первом сообщение. Теперь нужно найти макс(HOUR1:HOUR24)
...
Рейтинг: 0 / 0
Максимум из значений в строке(диапазона значений в строке)
    #39771650
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Такая функция: (и смените названия полей:date,count-это зарезервированные слова)
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
Function my(myDate) 'аргумент-поле с датой из Вашего запроса
Dim i, q, rash, rs As Recordset
Set rs = CurrentDb.OpenRecordset("select * from запрос1 where поле1=#" & Format(myDate, "mm\/dd\/yy") & "#")
   For i = 4 To 28 'нумерация полей начинается с 0
         rash = rs(i)
            If rash >= q Then q = rash
   Next
my = q
End Function
...
Рейтинг: 0 / 0
Максимум из значений в строке(диапазона значений в строке)
    #39771682
mikle08es2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sdku,
А можно поподробнее запрос1 -это, я так понял мой запрос который выводит таблицу, а Поле1??? это поле датой?
...
Рейтинг: 0 / 0
Максимум из значений в строке(диапазона значений в строке)
    #39771704
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikle08es2,
все верно: запрос1-Ваш запрос,поле1-поле с датой
приложите фрагмент БД (таблицу и запрос)покажу подробно
...
Рейтинг: 0 / 0
Максимум из значений в строке(диапазона значений в строке)
    #39771714
mikle08es2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sdku,
С радостью бы приложил, просто очень сложная схема данных, которая подтягивает данные с внешних источников. Нужно потратить много времени, чтобы сделать локальную версию.
Еще один вопрос: Эта функция применяется выражении прямо в моем запросе( то есть в том запросе который сам получает данные из вне) или же в новом запросе, который обращается к первому запросу?
...
Рейтинг: 0 / 0
Максимум из значений в строке(диапазона значений в строке)
    #39771717
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikle08es2,
прямо в Вашем запросе:
функция в общем модуле, а в запросе вычисляемое поле: my(полеЗапросаСдатой)
...
Рейтинг: 0 / 0
Максимум из значений в строке(диапазона значений в строке)
    #39771720
mikle08es2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sdku,
Видимо уже не соображаю. Все так и седлал
Вычисляемое поле: my([myDate])

ругается на функцию, слишком мало параметров. требуется 2.
...
Рейтинг: 0 / 0
Максимум из значений в строке(диапазона значений в строке)
    #39771722
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: vbnet
1.
2.
SELECT ctlDate,формулаПоКоторойСчитаете as h1,....as h2,..... as h3,иТд, my(ctlDate) AS maxSytki
FROM tbl;


Важно задать такие значения счетчика в цикле FOR чтоб обращение шло к нужным полям
...
Рейтинг: 0 / 0
Максимум из значений в строке(диапазона значений в строке)
    #39771728
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну правильно ругается-наверное в запросе есть группировка.
"Ванговать" я не умею и пока не буду знать как в полях HOUR образуются значения и что является источником запроса ничего конкретного сказать не могу
...
Рейтинг: 0 / 0
Максимум из значений в строке(диапазона значений в строке)
    #39771729
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sdkuТакая функция: (и смените названия полей:date,count-это зарезервированные слова)
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
Function my(myDate) 'аргумент-поле с датой из Вашего запроса
Dim i, q, rash, rs As Recordset
Set rs = CurrentDb.OpenRecordset("select * from запрос1 where поле1=#" & Format(myDate, "mm\/dd\/yy") & "#")
   For i = 4 To 28 'нумерация полей начинается с 0
         rash = rs(i)
            If rash >= q Then q = rash
   Next
my = q
End Function



-А функция то какой тип возвращает ?
my = q
- там вообще то все переменные в том числе и та что в цикле крутится As Recordset
...
Рейтинг: 0 / 0
Максимум из значений в строке(диапазона значений в строке)
    #39771747
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikle08es2,
mikle08es2...
Необходимо последним столбцом посчитать максимальное потребление из диапазона MAX(HOUR1:HOUR24)
1)за каждые сутки
2) только за рабочие сутки


Неужели в Access нет функции расчета максимума из строчного диапазона?
...
Прежде всего, то, что вы хотите, в access делается перекрестным запросом.
Там есть желаемый вами "максимум по строке".
для того, чтобы его составить, нужна другая структура таблицы с исходными данными.

И, прежде чем читать этот пост дальше, разберитесь с тем, как это правильно делать
в Access с использованием перекрестного запроса.
---------------------------------------------------------
---------------------------------------------------------
---------------------------------------------------------
Предположим, у вас есть разумные основания, для того,
чтобы сознательно делать это "неправильно", на основе вашей наличной структуры данных.

Этого нельзя сделать так, как вы хотите.
Потому что в строке таблицы нет диапазонов.
К полям в запросе нельзя обратиться как целому массиву,
или к "диапазону его полей" непосредственно из самого запроса.
(с оговоркой на исключение из рассмотрения предложенного вам ранее специального варианта с рекурсивным открытием рекордсета в функции)

Но можно написать функцию, принимающую произвольное число параметров, и выбирающую из них "максимум".
Если такую функцию назвать Greatest,
то обратиться к ней с первыми 10 полями hour из запроса можно будет так:
Код: vbnet
1.
Greatest(hour1,hour2,hour3,hour4,hour5,hour6,hour7,hour8,hour9,hour10)


Для 24 полей их придется явно все перечислить.
Сокращенной записи сорта [hour1:hour24] для полей запроса нет.
Будем считать, что вы осознанно хотите явно перечислить все 24 поля.
Разберемся с реализацией.

И начнем с того, как мог бы выглядеть обычный максимум, выбирающий из двух значений.
Например, вот так:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
rem  - private потому, что не планируем использовать непосредственно в запросе
Private Function max_vn(px As Variant, py As Variant) As Variant
  If px < py Then
    max_vn = py
  Else
    max_vn = px
  End If
End Function



Такой максимум не годится для непосредственного использования в запросе.
У правильного максимума, имеющего целью сравнение двух значений в одной строке
запроса может быть два варианта разумного поведения:

а) если любой из его параметров равен Null, то он возвращает Null.
Т.е. он "больше" любого числового значения.
И это традиционный вариант интерпретации Null в строке.
(максимум с произвольным числом параметров с таким поведением будем называть просто Greatest)

б) если один из параметров Null, а другой нет, то возвращается числовое значение, Null игнорируется.
В этом варианте Null "меньше" любого числового значения.
На практике мне не известно использование в стандартных реализациях строчных максимумов такого варианта поведения.
Но, так как структура ваших данных нетрадиционна, то именно такой строчный "максимум" вы и ищете.
В этом варианте Null меньше любого числового значения.
(Такой максимум с произвольным числом параметров назовем Greatest_IgnoreNull)

Начнем с обычного, "стандартного" Greatest
Понятно, что max_vn для стандартного greatest, используемого в запросе не годится.
Исправим его поведение и назовем max_vn_nonnull
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
rem  - не для использования в запросах
Private Function max_vn_nonnull(px As Variant, py As Variant) As Variant

  If IsNull(px) Or IsNull(py) Then
    max_vn_nonnull = Null
  ElseIf px < py Then
    max_vn_nonnull = py
  Else
    max_vn_nonnull = px
  End If
End Function




Тогда стандартный Greatest может выглядеть так:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Public Function Greatest(px As Variant, py As Variant, ParamArray pa_others() As Variant) As Variant
  
  Dim i&, j&, k&
  i = LBound(pa_others)
  j = UBound(pa_others)
  
  Greatest = max_vn_nonnull(px, py)
  
  For k = i To j
    Greatest = max_vn_nonnull(Greatest, pa_others(k))
  Next k
  
End Function




Теперь про нестандартный.
Исходный max_vn годится для нестандартного, когда первый параметр числовой, и не годится, когда первый
параметр Null.
В случае, когда достоверно известно, что именно первый параметр Null, можно поменять параметры местами в обращении к max_vn
Поэтому дописываем к max_vn такую обвязку:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
rem  - не для использования в запросах
Private Function Max_ignoreNull(px As Variant, py As Variant) As Variant

  If Not IsNull(px) Then
    Max_ignoreNull = max_vn(px, py)
  Else
    Max_ignoreNull = max_vn(py, px)
  End If
End Function




Теперь нестандартный вариант становится таким:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Public Function Greatest_IgnoreNull(px As Variant, py As Variant, ParamArray pa_others() As Variant) As Variant
  Dim v_localMax As Variant
  Dim i&, j&, k&
  i = LBound(pa_others)
  j = UBound(pa_others)
  
  v_localMax = Null
  v_localMax = Max_ignoreNull(v_localMax, px)
  v_localMax = Max_ignoreNull(v_localMax, py)
      
  For k = i To j
    v_localMax = Max_ignoreNull(v_localMax, pa_others(k))
  Next k

  Greatest_IgnoreNull = v_localMax
End Function



Эта функция вернет Null, только если все переданные ей фактические параметры имеют значение Null.
...
Рейтинг: 0 / 0
Максимум из значений в строке(диапазона значений в строке)
    #39771773
mikle08es2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
booby,

boobyПрежде всего, то, что вы хотите, в access делается перекрестным запросом.
Там есть желаемый вами "максимум по строке".
для того, чтобы его составить, нужна другая структура таблицы с исходными данными.

И, прежде чем читать этот пост дальше, разберитесь с тем, как это правильно делать
в Access с использованием перекрестного запроса.


Подскажите тогда, в какой таблице необходимо хранить такого рода данные?
Есть Даты, код потребителя, количество получасовых значений электропотребления, и 48 значений электропотребления за каждые полчаса суток. Насколько мне известно перекрестным запросом можно в строке групповых операций задать только один раз значение., а у меня их 48.

Я думаю поэтому перекрестный запрос и не подходит.
...
Рейтинг: 0 / 0
Максимум из значений в строке(диапазона значений в строке)
    #39771776
mikle08es2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sdku,


Делал, делал Вам пример, чтобы помогли разобраться. Около часа делал. Сделал. и бац все работает в примере.
Спасибо!!!

А в общей базе нет.))))

Единственное, что приходит в голову, в общей базе для выборки по датам ссылаюсь на форму с ячейками, в которых вколочены даты. Ковыряю дальше.
...
Рейтинг: 0 / 0
Максимум из значений в строке(диапазона значений в строке)
    #39771799
mikle08es2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sdku,

Странно. Максимум ищет но не во всех строках верно.
...
Рейтинг: 0 / 0
Максимум из значений в строке(диапазона значений в строке)
    #39771868
mikle08es2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sdku,

Совершенно не ясно почему не правильно берет максимум в некоторых строках....
...
Рейтинг: 0 / 0
Максимум из значений в строке(диапазона значений в строке)
    #39771908
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikle08es2,
в строках где нет расхода должен быть 0 (значение по умолчанию)
до цикла FOR инициировать переменную q=0
...
Рейтинг: 0 / 0
Максимум из значений в строке(диапазона значений в строке)
    #39771922
mikle08es2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sdku,
А как это должно помочь? Не понимаю.
...
Рейтинг: 0 / 0
Максимум из значений в строке(диапазона значений в строке)
    #39771971
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikle08es2,
как вариант (см.форму "vybor")
...
Рейтинг: 0 / 0
Максимум из значений в строке(диапазона значений в строке)
    #39772002
mikle08es2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sdku,
Спасибо за помощь, но это не совсем, что нужно.
У меня получилось верно искать максимум если во всех ячейках пустых проставить нули. Единственное, я так и не понял почему не получается сделать это при наличии пустых полей.
...
Рейтинг: 0 / 0
Максимум из значений в строке(диапазона значений в строке)
    #39772017
mikle08es2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sdku,
Спасибо за помощь, но это не совсем, что нужно.
У меня получилось верно искать максимум если во всех ячейках пустых проставить нули. Единственное, я так и не понял почему не получается сделать это при наличии пустых полей.
...
Рейтинг: 0 / 0
Максимум из значений в строке(диапазона значений в строке)
    #39772031
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikle08es2почему не получается сделать это при наличии пустых полей.Под "пустыми полями" разумеется поле со значением NULL?

Если так - то следует помнить, что проверка на это значение должны выполняться особым образом. Если с точки зрения хранения данных NULL - это "значение отсутствует", то с точки зрения обработки данных NULL - это "значение неизвестно". Или, для простоты понимания - "фиг знает". И по этой причине любое действие с NULL даёт NULL - и сравнение (равны ли единица и "фиг знает"? а фиг знает...), и, скажем, сложение (чему равно единица плюс "фиг знает"? а фиг знает...).

NULL в качестве результата сравнения интерпретируется как False - потому что всё, что не гарантирует True, есть False. И если в длинной цепи проверок затесался хотя бы один NULL - он, как вирус, расползётся по всему выражению. И окончательным итогом окажется NULL. Который, как сказано выше, False.

А потому, если значение поля может быть NULL, необходимо либо добавлять соответствующую проверку (WHERE поле = что-то OR поле IS NULL), либо конвертировать NULL в конкретное определённое значение (WHERE IFNULL(поле, что-то_особенное) = что-то).
...
Рейтинг: 0 / 0
Максимум из значений в строке(диапазона значений в строке)
    #39772174
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikle08es2...Единственное, я так и не понял почему не получается сделать это при наличии пустых полей.потому что NULL<>0 (не больше и не меньше-просто ничто.Ведь в Ёкселе,при автосуммировании значение NULL преобразуется в 0 только происходит это молча-по умолчанию) и существует ряд способов не отображать 0 в поле формы,сохраняя это значение в поле таблицы (функции NZ,IIF)
В предложенном варианте хранения данных создание запросов(подобных открывшему топик) не вызовет затруднений
Сам запрос:(Функцию определения максимального расхода сочините сами по аналогии с процедурой)
Код: vbnet
1.
2.
3.
4.
5.
TRANSFORM IIf(Sum([rashod])=0,"",Sum([rashod])) AS Выражение1
SELECT glavnaia.Rdata, organiz.naim
FROM organiz INNER JOIN (glavnaia INNER JOIN rashod ON glavnaia.IdGl = rashod.IdGl) ON organiz.naim = glavnaia.organiz
GROUP BY glavnaia.Rdata, organiz.naim
PIVOT "h" & Left([po],InStr([po],":")-1) In ("h0","h1","h2","h3","h4","h5","h6","h7","h8","h9","h10","h11","h12","h13","h14","h15","h16","h17","h18","h19","h20","h21","h22","h23");
...
Рейтинг: 0 / 0
Максимум из значений в строке(диапазона значений в строке)
    #39772216
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
boobyПрежде всего, то, что вы хотите, в access делается перекрестным запросом.
Там есть желаемый вами "максимум по строке".
Интересно:и хде же он? Ведь в перекрестном запросе "значение" это результат групповой операции (например SUM) и MAX по этому полю в заголовке строк даст наибольшее слагаемое из которых состоят "значения" отображаемые в строке, а MAX(SUM(..)) применить не удастся
...
Рейтинг: 0 / 0
25 сообщений из 29, страница 1 из 2
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Максимум из значений в строке(диапазона значений в строке)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]