powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Максимум из значений в строке(диапазона значений в строке)
29 сообщений из 29, показаны все 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
Максимум из значений в строке(диапазона значений в строке)
    #39772295
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот интересно, дойдёт ли автор до понимания, что нужно нормализовать исходные данные, уйдя от этой нелепой структуры хранения? хотя бы для того, чтобы избавиться от всех проистекающих из неё трудностей и, как следствие, набора кривых костылей...
...
Рейтинг: 0 / 0
Максимум из значений в строке(диапазона значений в строке)
    #39772300
Фотография Лапух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina...чтобы избавиться от всех проистекающих из неё трудностей и, как следствие, набора кривых костылей...
Многие считають, что на костылях - Забавнее и Интереснее.
Некоторым даже милостыню подают.
...
Рейтинг: 0 / 0
Максимум из значений в строке(диапазона значений в строке)
    #39772482
mikle08es2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

Так подскажите как хранить такие данные????
...
Рейтинг: 0 / 0
Максимум из значений в строке(диапазона значений в строке)
    #39772491
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikle08es2,
Хотя-бы так.Чем Вас, конкретно, не устраивает этот пример?
...
Рейтинг: 0 / 0
29 сообщений из 29, показаны все 2 страниц
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Максимум из значений в строке(диапазона значений в строке)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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