Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите посчитать "единицы"  [new]
karan
Member

Откуда:
Сообщений: 6
Я - новичок. Сразу извиняюсь за глупые вопросы. :)

Есть бинарная маска "01100101010101..." неопределенной длинны хранимая предположительно в varbinary(max).
Каждая 1 - событие от устройства, количество которых постоянно увеличивается.
Нужно посчитать количество этих событий.

Может я туплю, но решений "влоб" я не нашел. :(
21 ноя 12, 13:22    [13506861]     Ответить | Цитировать Сообщить модератору
 Re: Помогите посчитать "единицы"  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
"Нормализация? Не, не слышал."
21 ноя 12, 13:24    [13506894]     Ответить | Цитировать Сообщить модератору
 Re: Помогите посчитать "единицы"  [new]
karan
Member

Откуда:
Сообщений: 6
Э... может я не понял:

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


Каким образом она мне поможет в работе с бинарной переменной?
21 ноя 12, 13:34    [13507006]     Ответить | Цитировать Сообщить модератору
 Re: Помогите посчитать "единицы"  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
karan
Э... может я не понял:

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


Каким образом она мне поможет в работе с бинарной переменной?
Читайте дальше про нормальные формы, и не сохраняйте больше кучу событий битами в один блоб, чтобы потом с бубном, приседаниями и прочими приятными любому программисту действиями что-то из этого блоба выковыривать.
21 ноя 12, 13:39    [13507067]     Ответить | Цитировать Сообщить модератору
 Re: Помогите посчитать "единицы"  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
substring
select 12&3
21 ноя 12, 13:41    [13507079]     Ответить | Цитировать Сообщить модератору
 Re: Помогите посчитать "единицы"  [new]
karan
Member

Откуда:
Сообщений: 6
Гавриленко Сергей Алексеевич,
Согласен, архитектура не верная (нельзя пихать кучу данных в одну ячейку таблицы).

Тогда опишу задачу:
Есть N устройств и M ситуаций. В каждой ситуации есть выбор из K типов сигналов (N,M и К постоянно увеличиваются).

Задача 1: определить ситуации в которых реагируют одинаковые устройства.
Задача 2(усложненный вариант): определить “сходные” по реакции устройства (Устройсто1 в 80% ситуаций реагирует такими же типами сигналов что и Устройство2)

Мой вариант решения был – выкинуть ситуации M и просто иметь сквозной список типов сигналов К. Для каждого устройства определяем маску из вариантов ответа К (да… будет очень большое число, но пока лучшего в голову не пришло) и в дальнейшем работаем с ними.
Задача 1 - Маска устройства 1 & маска устройства 2.
Задача 2 - … еще в процессе :)

Буду благодарен если подскажете где “путь истинный”!
21 ноя 12, 14:15    [13507370]     Ответить | Цитировать Сообщить модератору
 Re: Помогите посчитать "единицы"  [new]
karan
Member

Откуда:
Сообщений: 6
Сорри... ошибся:

Задача 1: определить устройства которые одинаково реагируют на все ситуации.
21 ноя 12, 14:18    [13507418]     Ответить | Цитировать Сообщить модератору
 Re: Помогите посчитать "единицы"  [new]
Glory
Member

Откуда:
Сообщений: 104751
karan
Буду благодарен если подскажете где “путь истинный”!

А MSSQL тут причем ?
Разбирайте свою "закодированную" информацию
Хотите - свои функции пишите, хотите можете использовать встроенные битовые операторы
21 ноя 12, 14:47    [13507741]     Ответить | Цитировать Сообщить модератору
 Re: Помогите посчитать "единицы"  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 35367
Блог
karan
Нужно посчитать количество этих событий.


1) заменить 0 на ''
2) посчитать длину строки
21 ноя 12, 14:54    [13507810]     Ответить | Цитировать Сообщить модератору
 Re: Помогите посчитать "единицы"  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
Критик
karan
Нужно посчитать количество этих событий.


1) заменить 0 на ''
2) посчитать длину строки

"Есть бинарная маска" (C)
21 ноя 12, 14:59    [13507875]     Ответить | Цитировать Сообщить модератору
 Re: Помогите посчитать "единицы"  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 35367
Блог
locky
"Есть бинарная маска" (C)


тут думать нужно, а в моем варианте - нет
21 ноя 12, 15:01    [13507911]     Ответить | Цитировать Сообщить модератору
 Re: Помогите посчитать "единицы"  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
locky
Критик
пропущено...


1) заменить 0 на ''
2) посчитать длину строки

"Есть бинарная маска" (C)
CAST(), вестимо. Плюс DATALENGTH()
21 ноя 12, 15:02    [13507915]     Ответить | Цитировать Сообщить модератору
 Re: Помогите посчитать "единицы"  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
SQL2008+
SELECT LEN(REPLACE(CONVERT(VARCHAR(MAX),BinaryMask,2),'0',''));
21 ноя 12, 15:11    [13508016]     Ответить | Цитировать Сообщить модератору
 Re: Помогите посчитать "единицы"  [new]
karan
Member

Откуда:
Сообщений: 6
iap
SQL2008+
SELECT LEN(REPLACE(CONVERT(VARCHAR(MAX),BinaryMask,2),'0',''));


Спасиб :) похоже более простой альтернативы нет
21 ноя 12, 15:23    [13508141]     Ответить | Цитировать Сообщить модератору
 Re: Помогите посчитать "единицы"  [new]
DeColo®es
Member

Откуда: Москва
Сообщений: 5503
Блог
karan
iap
пропущено...


Спасиб :) похоже более простой альтернативы нет
Ну, если этот вариант "в лоб" помог, то проблема не в том, что нужно строку преобразовывать/анализировать, а в структуре данных, где показатели хранятся во-первых "не по реляционному", а во-вторых - в строке вместо битов, то есть примерно со 100-200 крытнам перерасходом "пространства".
21 ноя 12, 15:52    [13508451]     Ответить | Цитировать Сообщить модератору
 Re: Помогите посчитать "единицы"  [new]
DeColo®es
Member

Откуда: Москва
Сообщений: 5503
Блог
DeColo®es
то есть примерно со 100-200 крытнам перерасходом "пространства".
Хотя раз уж у вас там битовая маска - все не настолько плохо с хранилищем, хотя в виде атрибутов это работало бы быстрее. КМК.
21 ноя 12, 15:58    [13508500]     Ответить | Цитировать Сообщить модератору
 Re: Помогите посчитать "единицы"  [new]
karan
Member

Откуда:
Сообщений: 6
DeColo®es
DeColo®es
то есть примерно со 100-200 крытнам перерасходом "пространства".
Хотя раз уж у вас там битовая маска - все не настолько плохо с хранилищем, хотя в виде атрибутов это работало бы быстрее. КМК.


Можно про атрибуты подробнее...
21 ноя 12, 16:06    [13508578]     Ответить | Цитировать Сообщить модератору
 Re: Помогите посчитать "единицы"  [new]
aleks2
Guest
Байт - это фсего то 256 значений.

varbinary - это цепочка байтов.
21 ноя 12, 17:09    [13509220]     Ответить | Цитировать Сообщить модератору
 Re: Помогите посчитать "единицы"  [new]
aleks2
Guest
declare @b table(byte binary(1) primary key clustered, bitcount tinyint)

insert @b
values(0, 0), (1, 1), (2, 1), (3, 2) ... (255, 8)

declare @nums table(n int primary key clustered)
insert @nums
values(1), (1), (3), (4) ... (многа)

select SUM(b.bitcount) TotalBitsCount
form @nums n inner join @b b on substring(@varbinary, n.n, 1) = b.byte
where n.n between 1 and length(@varbinary)
21 ноя 12, 17:29    [13509376]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить