Арифметическая "сцепка" чисел в одно число с сохранением уникальности ряда25.01.2024, 11:10. Показов 2762. Ответов 34
Приветствую!
По названию сложно понять, как тема относится к SQL. Поясняю. Есть реальная таблица (на самом деле, это соединение нескольких таблиц, но упрощаю) с 12ю полями, участвующими в группировке (да — вот так и сократить вряд ли получится), а также 2мя полями (кол и сумм) для агрегации и 2мя полями, которые нужно будет "подтянуть" в сгруппированную таблицу. Разумеется, группировка и, тем более, последующее "подтягивание" по такому количеству полей происходят очень долго. Появилась идея для ускорения: математически "сцепить" построчно поля для группировки в одно с сохранением уникальности и однозначности ряда — так, чтобы значения рядов "1•2•3", "2•1•3", "3•2•1" (и так далее) сохранили уникальность. Пока тестирую на простой текстовой сцепке — как показал, но, думаю, что математика будет лучше (и, скорее всего, быстрее), т.к. индекс по числу построить гораздо проще/быстрее, чем по строке (я так думаю, но не уверен). Предлагаю рассмотреть вариант агрегации в Float (BigInt не хватит для этих целей). Мои поля, максимальное количество цифр в значении (после "_"). Диапазон значений (в круглых скобках). 0 вместо Null:
Float: (округл. до 2ух знаков после запятой)
Price(-10^15 — 10^15) Int_10(0 — 9 999 999 999): Est Int_7(0 — 9 999 999): Spr1 Spr2 Spr3 Int_5(0 — 99 999): Unit TynyInt: Type_1(1-4) Bit(0-1): B1 B2 B3 B4 Алгоритм: 1. Приводим Float к целому, чтобы использовать дробную часть в дальнейших преобразованиях: 100* Round(Field, 2). 2. Четыре Bit-поля преобразуем в одно число до 4ёх знаков: 1000*B1 + 100*B2 + 10*B3 + B4 То есть, вместо "1•0•0•1" получим 1001, а вместо "0•0•1•1" получим 11.
0
|
|
| 25.01.2024, 11:10 | |
|
Ответы с готовыми решениями:
34
Как поделить одно двоичное число на другое с сохранением остатка? Добавление записей с сохранением уникальности, подсчет количества Insert без дублей (вставка записей в таблицу с сохранением их уникальности) |
| 29.01.2024, 15:32 [ТС] | |||||||
|
Аватар, большое вам спасибо!
![]() ![]() Добавлено через 4 часа 6 минут Заметки про Float to Binary
Для перевода без потери точности 14ти знаков (как я понял, неважно, десятичные ли они) 8ми байт не хватает, нужно 10
0
|
|||||||
|
1310 / 363 / 99
Регистрация: 14.10.2022
Сообщений: 1,107
|
|
| 29.01.2024, 15:55 | |
|
Jack Famous, вы чем то странным, ей богу, занимаетесь, на мой взгляд.
0
|
|
| 29.01.2024, 16:22 [ТС] | ||
|
uaggster, возможно, но только время покажет.
Я отпишусь по итогу тестов. Добавлено через 20 минут Помним, что логарифм по основанию 2 числа N это показатель степени, в которую нужно возвести 2, чтобы получить N. То есть, если мне нужно узнать, сколько байт нужно для кодирования числа N, мне нужно вычислить Log_2(N + 1) / 8 и (если я получил НЕцелое число) округлить в большую строну до целого. Например, для кодирования(перевода в Binary) числа 255 достаточно (Log_2(256) = 8 bit) 1 байта, а вот 256 уже потребует 2 байта.
0
|
||
|
1310 / 363 / 99
Регистрация: 14.10.2022
Сообщений: 1,107
|
|
| 29.01.2024, 17:15 | |
|
На самом деле, вам же нужен просто некий уникальный маркер n каких-то полей, чтобы осуществлять по нему поиск или группировку?
Ну, возьмите MD5 хэш этих полей. Он заведомо, для вашей задачи - уникален. И, кстати, довольно компактный, и весь из себя стандартный. Конечно он тяжеловат, и налету его не особенно повычисляешь, но как калькулируемое persisted поле с индексом по нему - почему нет? Или, если эти сами n полей - не слишком массивные, можно еще посчитать по ним бинарную хэш-сумму, тоже сделать ее persisted, и построить по ней индекс, include эти самые n полей. Ну и, собственно, поиск осуществлять по равенству этой хеш - суммы, с дополнительным равенством по полям, и группировку тоже - по хеш-сумме, и по полям. Я когда-то, очень давно, когда миллион строк считалось солидным размером таблицы, а сто миллионов - чем-то очень большим и невообразимым, делал похожим образом быстрый поиск по ~100 миллионной базе фио, с возможностью оператора ошибиться в нескольких буквах при вводе. Соответственно, в виде хэша выступали первые буквы фамилии, имени, отчества, а индекс был, см. выше - ФИО + include (фамилия, имя, отчество). Соответственно, сравнение шло по равенству хеша, и нечеткому поиску (на С написал расширенную хранимую процедуру, считающую дистанцию редактирования) со сравниваемыми полями. Там, правда не все так просто было. Потому что исказить могли и первые буквы, да и буквосочетания типа КАА, САА - имеют по полмиллиона входов, а чтобы всё это работало с приемлимой скоростью порция должна была быть тысяч 10, но смысл был примерно такой. В реальном режиме времени работало, на пентиум-3 (или что-то типа того). Так что подход рабочий, но, в целом, в современном мире - не нужный. Ни место экономить не надо, ни ресурсы процессора.
1
|
|
|
5393 / 1465 / 513
Регистрация: 31.05.2012
Сообщений: 5,153
|
||||||||||
| 29.01.2024, 18:04 | ||||||||||
1
|
||||||||||
| 30.01.2024, 09:34 [ТС] | |
|
Аватар, вы правы, спасибо — не учёл этот момент
![]() uaggster, у меня сложная комплексная задача и я не хочу "с ходу" просить помощи без своих проб. Вот попробую несколько различных вариантов и создам тему не просто с вопросом, а с конкретными вариантами и их таймингами. Вот тогда и обсудим ![]() Спасибо за пример задачи — я бы ещё Collate Cyrillic_General_BIN использовал. Должно быть сильно быстрее
0
|
|
| 12.03.2024, 09:58 [ТС] | |
|
Снова здравствуйте!
Друзья, подскажите, пожалуйста вот такой момент: Есть 2 Int поля, но во 2ом значения могут быть только от 1 до 20. В 1ом могут быть сотни миллионов (Int до 2ух с лишним миллиардов). Могу ли я сделать Binary(5) поле, в которое я сложу ( Cast F1 As Binary(4) ) + ( Cast F2 As Binary(1) )) и быть при этом уверенным, что коллизий и прочих неприятностей не будет?
0
|
|
|
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
|
||||||
| 12.03.2024, 13:08 | ||||||
Сообщение было отмечено Jack Famous как решение
Решение
1
|
||||||
| 12.03.2024, 13:26 [ТС] | |
|
invm, приветствую и спасибо!
Я правильно понимаю, что без конверта в более маленький тип я могу получить "обрезанное" число?
0
|
|
|
5393 / 1465 / 513
Регистрация: 31.05.2012
Сообщений: 5,153
|
|
| 12.03.2024, 14:09 | |
Сообщение было отмечено Jack Famous как решение
Решение
C tinyint исключение получишь если там не подходящее число, а без него просто обрежет
1
|
|
| 12.03.2024, 14:31 [ТС] | |
|
Аватар, это понятно, но, если я ПРЯМ УВЕРЕН, что в Int-поле будет не более TinyInt (просто начальник для целых только Int использует
) ?
0
|
|
|
5393 / 1465 / 513
Регистрация: 31.05.2012
Сообщений: 5,153
|
|
| 12.03.2024, 14:34 | |
|
Если ПРЯМ то результат аналогичен ) От 255 и получишь ff
0
|
|
| 12.03.2024, 14:55 [ТС] | ||
|
Аватар, ну и отлично. Спасибо!
Но на будущее запомню о такой проверке.
0
|
||
|
1310 / 363 / 99
Регистрация: 14.10.2022
Сообщений: 1,107
|
|||||||
| 12.03.2024, 15:19 | |||||||
|
Что-то типа:
1
|
|||||||
| 12.03.2024, 16:00 [ТС] | |
|
uaggster, не туда разговор зашёл
![]() Но спасибо
0
|
|
| 12.03.2024, 16:00 | |
|
Дан ряд чисел от 7 до -7, с шагом 0, 5 (арифметическая прогрессия). Нужно сравнить каждое число с 0. Если <0 то это число *5, если нет, то /5. Вычислить одно значение суммы ряда, где аргументом будет число(числа)
Циклы: Задано натуральное число n. Найти количество натуральных чисел, не превышающих n и не делящихся ни на одно из чисел 2, 3, 5 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства.
Родственных связей существует 8 ступеней, такие как:
p - отец
P - мать
q - муж
Q - жена
b - брат
B - сестра
s - сын
S - дочь
|
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире.
Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
|
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
|
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
|
|
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
|
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701
Купил два термопринтера QR701.
На сэлф-тесте написано:
Language: PC936 (GB18030).
Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
|
Создание формы заимствованного документа
Maks 03.08.2026
Задача:
Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также
табличная часть со следующими реквизитами:
- Расчетный счет покупателя. . .
|
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача:
В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
|