И опять остатки по датам (Qlikview, Qlik Sense)

Автор millik, 27 апреля 2016, 09:54:15

« назад - далее »

millik

Добрый день.
Опять коснемся темы остатков.

Сразу скажу что предрасчет остатков на каждый день при загрузке не подходит от слова совсем. 10 000 номенклатурных позиций * ~20 партий каждая * 10 складов * за последние 2 года  = больше 1 млрд строк.

В качестве источника данных - регистр 1С 7.7. Расчет остатков происходит путем суммирования всех движений до нужной даты.

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

Теперь о главном. Я создаю таблицу с измерением Товар и мерой Sum({$<ДатаР={"<=$(=Max(ДатаО))"}>}КолДвиж*ТипДвиж). При выборе ДатыО из общего календаря, происходит расчет остатков на конец последней ДатыО из произведенной выборки. Остаток рассчитывается корректно. Если выборки в ДатеО нет, то остаток просто считается на максимальную ДатуО. Т.е. на выходе получаем простенькую таблицу Товар и его остаток на конец выбранного периода.

Теперь мне нужно остатки разложить по всем датам, чтобы в таблице видеть остатки на конец каждого дня в выбранном периоде. И вот тут у меня начинаются проблемы.
Я в эту таблицу добавляю измерение ДатаО. Формула меры не понимает, что ДатуО нужно брать из своей строки таблицы, а смотрит глобальную выборку. Соответственно по всем строкам идут одинаковые значения. Я так понимаю это происходит потому что нет ассоциативной связи с этим полем.
Хотя если в таблицу добавить еще одну меру Max(ДатаО), то тут всё верно отображается, а в общей формуле нет. Не могу понять.

Собственно вопрос. Как обойти эту проблему? Как в формуле явно указать, что нужно брать ДатуО из своей строки?
Или может есть иные способы разложить остатки по датам. Опять же, предрасчет не предлагать.

Заранее спасибо.

Извините, вам запрещён просмотр содержимого спойлеров.


Извините, вам запрещён просмотр содержимого спойлеров.

millik

#1
Кому интересно, то для моей модели данных предложили такую меру.
sum(aggr(sum(DISTINCT if(ДатаР<=ДатаО ,КолДвиж*ТипДвиж)) ,ДатаО,ДатаР))
Она работает для небольших объемов данных. Но при большом объеме данных (у меня в регистре ~4 млн записей) естественно всё виснет.

Ещё в комьюнити предложили второй вариант
ЦитироватьКроме вашего варианта с Data Island, есть еще способ AsOfDate с созданием нового поля ДатаН, связанного с ДатаР. Каждая дата в ДатаН, соответствует всем датам из ДатаР, предшествующим или равным этой дате. В вашем примере, с 3-м января в ДатаН будут связаны даты с 1-го по 3-е января в ДатаР. Тогда в качестве измерения нужно указывать новое поле ДатаН, а мера совсем простая получится sum(ТипДвиж*КолДвиж).

Тоже работает на тестовых данных.

Edit.
Проверил на реальниых данных. ~4 млн строк ворочает нормально. Хотя если начинать считать всякие оборачиваемости, то уже начинаются тормоза, нужен хороший сервак для этого.

admin

Цитата: millik от 11 мая  2016, 09:00:11  
Edit.
Проверил на реальниых данных. ~4 млн строк ворочает нормально. Хотя если начинать считать всякие оборачиваемости, то уже начинаются тормоза, нужен хороший сервак для этого.
0,5 млрд.строк на посредственной технике и предрасчитанных остатках работает существенно быстрее чем вариант на формулах.

kvv

Добрый день.
Есть у меня задачи с "размножением остатков".
И все же, их "размножаю" на этапе загрузки. Строк получается больше на 15-20 %, но зато нет "безумных" агрегаций и вычислений в дашборде. В итоге, для меня такой вариант предпочтительней. Количество строк около 300 000 000.

Яндекс.Метрика