|
73 / 47 / 9
Регистрация: 24.03.2014
Сообщений: 470
|
|||||||||||||||||||||
Сложить между собой поля записей в таблице нарастающим итогом25.11.2015, 00:25. Показов 5951. Ответов 22
Метки нет (Все метки)
Друзья, такая задача:
есть таблица записей - индекс и числовое поле. Необходимо запросом вывести оба поля и добавить еще одно, в которое суммировались бы все числовые поля предыдущих записей и текущей:
Но у меня таких записей в таблице несколько десятков тысяч, вот я и подумал, что sql будет быстрее. Вот только реализовать не понимаю как (как обратиться к числовому полю предыдущей записи в запросе)? Вообще к этому общий вопрос - при необходимости выполнения сложных математических операций (корень, степень) при большом массиве записей (несколько сотен тысяч) что будет разумнее? Через vba, вынести таблицы на sql-сервер, запросам в jetsql акса?
0
|
|||||||||||||||||||||
| 25.11.2015, 00:25 | |
|
Ответы с готовыми решениями:
22
Посчитать последовательность нарастающим итогом Свод нарастающим итогом из нескольких листов Форма с таблицей в которой поле считается нарастающим итогом |
|
26826 / 14506 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
|
||||||
| 25.11.2015, 00:51 | ||||||
|
Запрос нарастающим итогом имеет например такую структуру
Ну и вопрос: а зачем все это делать в запросе? В отчете нарастающий итого легко делается встроенными средствами. Добавлено через 4 минуты Математические операции Jet SQL как раз неплохо обрабатывает, достаточно быстро. А вот более или менее сложные запросы с подзапросами типа нарастающего итога или скользящего среднего у него получаются хуже. Серверные БД в этом плане быстрее. Ну а на ВБА, что считать если Вам нужен результат для каждой записи? Только разве что записывать во временную таблицу или свободный рекордсет.
3
|
||||||
|
73 / 47 / 9
Регистрация: 24.03.2014
Сообщений: 470
|
||||
| 25.11.2015, 01:00 [ТС] | ||||
|
Добавлено через 2 минуты Добавлено через 4 минуты
0
|
||||
|
26826 / 14506 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
|
||
| 25.11.2015, 01:15 | ||
|
Идея поиска в следующем: - задаем эпсилон: величину допуска. Если расчетная величина отличается от заданной меньше чем на эпсилон, поиск считается удачным и прекращается. - задаем величину суммы для поиска, пусть для определенности: сумма - Делаем бесконечный цикл - - Создаем запрос с Top 50 Percent - - Находим Сумму и сравниваем с заданным значением. Если Сумма меньше эпсилон, прекращаем поиск. Если разница больше эпсилон, меняем параметр в Top N Percent, например в сторону уменьшения (делим N пополам) если найденная сумма больше заданного значения. Или увеличиваем, если найденная сумма меньше заданного значения - Повторяем цикл пока не будет найдена сходимость с заданной точностью. Вот такой простейший цикл для поиска по половинному делению. Простейший подсчет показывает, что для таблицы в 100 тысяч записей, нужно будет максимум 17 раз выполнить запрос. Вместо 100 тысяч повторений, как в запросе нарастающим итогом
0
|
||
|
73 / 47 / 9
Регистрация: 24.03.2014
Сообщений: 470
|
||
| 25.11.2015, 01:25 [ТС] | ||
|
0
|
||
|
26826 / 14506 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
|
|||||||||||
| 25.11.2015, 06:32 | |||||||||||
Сообщение было отмечено alvk как решение
Решение
Даю функцию, которая находит ID методом половинного деления для первых, упорядоченных по ид записей, сумма числового поля которых не превосходит заданного числа. Обращение к функции (пример):
Запрос нарастающим итогом для 18000 записей длился 330 сек. Для остальных запрос не делал - будет работать сутками. Добавлено через 19 минут Длинный Debug.Print остался от отладки. Его можно выкинуть. А Debug.Print t2 - t1 выводит в область отладки время исполнения в секундах. Возможно пригодится...
3
|
|||||||||||
|
шапоклякистка 8-го дня
|
||||||||||||
| 25.11.2015, 09:49 | ||||||||||||
|
Если да, то я бы сделала примерно так: модуль с двумя статичными переменными, одна из которых накапливает сумму, другая - хранит номер суммы. И две функции: одна обнуляет переменные, другая обрабатывает:
P.S. в функции подразумевается, что если при добавлении очередного слагаемого накопительная сумма вышла больше эталонной - то не все слагаемое, а только сумма превышения начинает накапливаться в следующую сумму. Скажем, эталонная сумма 10, а слагаемые 3, 4, 5 - то 5 маркируется как первый элемент следующей суммы, но в следующую накапливается не вся 5, а только 2 - превышение предыдущего эталона. Добавлено через 42 минуты Мдя, что-то я упустила из виду случай точной кратности накопившейся суммы и эталонной - неправильно считает в этом случае. Нужно будет поправить на досуге. Извините за непрверенный код.
1
|
||||||||||||
|
73 / 47 / 9
Регистрация: 24.03.2014
Сообщений: 470
|
||
| 25.11.2015, 10:11 [ТС] | ||
|
0
|
||
|
шапоклякистка 8-го дня
|
|
| 25.11.2015, 10:15 | |
|
Eujine, добавьте лишнее поле в вашей таблице и один раз занесите в него накопительные суммы. А потом запросами отбирайте что хотите )
0
|
|
|
73 / 47 / 9
Регистрация: 24.03.2014
Сообщений: 470
|
||
| 25.11.2015, 10:30 [ТС] | ||
|
Другими словами имеем, допустим, десять записей с числовыми значениями конкретного поля от 1 до 10, которые отсортированы в порядке уменьшения (сортировку можно закрепить счетчиком). И есть три множества - сумма до 20 (назовем ее группой А), от 20 до 40 (группа В) и все, что больше 40 (группа С). Мне нужно получить на выходе результат типа: к группе А относятся записи 10 и 9 (10+9 = 19, следующая запись при суммировании уже превысит предел множества, поэтому сюда попадать не должна); к группе В - записи 8, 7, 6 (они попадут сюда, потому что 19+8+7+6 = 40, то есть попадают в интервал от 20 до 40, а запись 5 уже снова за пределами множества); ну и к группе С отойдут записи с 5 по 1 (думаю, тут логика ясна). Добавлено через 2 минуты texnik-san, лишнее поле в таблицу? )) Выше уважаемый mobile, уже написал, почему подсчет накопительной суммы нежелателен при таком количестве записей - у меня нет нескольких суток на обработку таких запросов. Еще раз, проблема в количестве записей. Речь идет о сотнях тысяч.
0
|
||
|
26826 / 14506 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
|
|
| 25.11.2015, 10:41 | |
|
Eujine, последовательно, в порядке возрастания пределов запускаете Poisk2del с параметром Summa равным сначала 19 - функция даст верхнюю границу первого множества A, затем с Summa=40, получим верхнюю границу второго множества B, где ID между Poisk2del(,,,19,) и Poisk2del(,,,40,). Все оставшиеся попадают в группу C где ID больше Poisk2del(,,,40,).
1
|
|
|
шапоклякистка 8-го дня
|
|||
| 25.11.2015, 10:43 | |||
|
0
|
|||
|
26826 / 14506 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
|
|
| 25.11.2015, 10:50 | |
|
Если данные таблицы не могут редактироваться, а только добавляться, то вариант texnik-san может быть применен. Но если редактироваться могут, то вариант с хранимой вычисленной суммой нежизнеспособен - придется после каждой редакции заново пересчитывать всю огромную таблицу. Ну или по меньшей мере ту ее часть, где ID больше изменяемой записи
0
|
|
|
шапоклякистка 8-го дня
|
|
| 25.11.2015, 11:11 | |
|
Сделала без предварительно вычисленных сумм, с таблицей интервалов и их буквенных обозначений.
Макрос запускает инициализирующую функцию и открывет запрос. ОДИН проход.
0
|
|
|
73 / 47 / 9
Регистрация: 24.03.2014
Сообщений: 470
|
||
| 25.11.2015, 11:17 [ТС] | ||
|
texnik-san, а в формате mdb нет примера? у меня 2003-ий..
Добавлено через 35 секунд
0
|
||
|
шапоклякистка 8-го дня
|
|
| 25.11.2015, 12:05 | |
|
Момент, я хочу еще немного оптимизировать (есть мысль как).
Добавлено через 44 минуты Хм. Я определенно проигрываю mobile по скорости.
0
|
|
|
73 / 47 / 9
Регистрация: 24.03.2014
Сообщений: 470
|
|||||||||||
| 25.11.2015, 13:05 [ТС] | |||||||||||
|
Медленно идем дальше. Дошел до итоговой стадии - подсчет коэффициента вариации. Есть конечно вариант считать его как
Есть еще одно решение - но я его писал и тестил только в формате обычного калькулятора. Так сказать калькулятор дисперсии, среднеквадратичного отклонения и коэффициента вариации:
0
|
|||||||||||
|
26826 / 14506 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
|
|||||||
| 25.11.2015, 13:24 | |||||||
0
|
|||||||
|
шапоклякистка 8-го дня
|
|
| 25.11.2015, 13:29 | |
|
Я за вами не успеваю. вот mdb наконец-то оптимизированного метода, время уже быстрее, чем у mobille.
Кроме того, вспомнила, что для случая, когда интервалы, на которые нужно разбивать числа, равные - для этой цели у Аксес есть встроенная функция. Имя не помню, но если нужно - по списку пробегусь и найду.
0
|
|
|
шапоклякистка 8-го дня
|
||
| 25.11.2015, 13:34 | ||
|
PS: при сохранении в mdb не поняла, почему vb перестал понимать типы данных database и dao.recorset, а также параметр метода execute. Это какую ж библиотеку он не смог найти?
Добавлено через 1 минуту
0
|
||
| 25.11.2015, 13:34 | |
|
Помогаю со студенческими работами здесь
20
Макрос создания нового листа в Эксель с названием от 1 и далее нарастающим итогом Два одномерных массива поэлементно сложить между собой - третий - сложить каждый элементы - вывести на экран Как связать между собой два поля (список значений одного поля зависит от значения другого поля) 2 Матрицы NxM сложить между собой Поиск записей в одной таблице, где значения ключевого поля не совпадают с полем в другой таблице Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|
|
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение:
В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры,. . .
|
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога
Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем.
. . .
|