Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / расчет среднего остатка. / 25 сообщений из 42, страница 1 из 2
08.09.2005, 21:28
    #33259906
Владимир Штепа
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
расчет среднего остатка.
Избитая задача. Есть начальный остаток, есть все транзакции. Как рассчитать среднии остаток в течение года,
если остаток на конец каждого дня не хранится (ибо сильно накладно).

Где решать пофиг, хоть в SQL, хоть в OLAP
...
Рейтинг: 0 / 0
08.09.2005, 22:18
    #33259942
vap
vap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
расчет среднего остатка.
Если иметь остаток на каждый день, остаток считается просто
1-й день - 30
2-й день - 20
3-й день - 20
4-й день - 30
-------------
средний остаток за 4 дня равен 100/4 = 25 единиц.

Если есть остатки не на каждый день, появляется погрешность
1-й день - 30
4-й день - 30
-------------
средний остаток за 4 дня равен 60/2 = 30 единиц.
...
Рейтинг: 0 / 0
08.09.2005, 22:50
    #33259964
inga
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
расчет среднего остатка.
vapЕсли иметь остаток на каждый день, остаток считается просто
1-й день - 30
2-й день - 20
3-й день - 20
4-й день - 30
-------------
средний остаток за 4 дня равен 100/4 = 25 единиц.

Если есть остатки не на каждый день, появляется погрешность
1-й день - 30
4-й день - 30
-------------
средний остаток за 4 дня равен 60/2 = 30 единиц.

ну вы товарищъ америку открыли просто
...
Рейтинг: 0 / 0
08.09.2005, 23:20
    #33259982
Владимир Штепа
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
расчет среднего остатка.
vapЕсли иметь остаток на каждый день, остаток считается просто
1-й день - 30
2-й день - 20
3-й день - 20
4-й день - 30
-------------
средний остаток за 4 дня равен 100/4 = 25 единиц.

Если есть остатки не на каждый день, появляется погрешность
1-й день - 30
4-й день - 30
-------------
средний остаток за 4 дня равен 60/2 = 30 единиц.

повторяю, что остаток хранится только на начало года(месяца) но не дня(ибо сильно накладно).
...
Рейтинг: 0 / 0
09.09.2005, 00:47
    #33260047
zmike
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
расчет среднего остатка.
надеюсь что не открою Америки...
есть такая идея... сейчас правда 1 a.m. :)

итак остаток на начало s
делаем
select sum(qty) group by date
получаем s1,s2,s3, ... sn - движение товара за день

тогда

S = (s + (s+s1) + (s+s1+s2) + ... (s+s1+s2...+sn)) / n

если это переписать как
S = (s*n + сумма по i от 1 до n ( si * (n-i+1) )) /n

то возможно за один проход cursor можно все посчитать....

а может если в sql написать функцию типа day_number_of_year(date)

то что-то типа
select sum( s * day_number_of_year(date) ) from (select sum(qty) as s, date group by date )
хотя если честно я не уверен что так вообще можно писать :)
...
Рейтинг: 0 / 0
09.09.2005, 10:12
    #33260394
Валек
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
расчет среднего остатка.
СрДневнОстатокКол=Avg(Descendants([Период],[Период].[День]), ([Measures].[НачОстатокКол]+[Measures].[КонОстатокКол])/2) считает средние остатки за период причем по дням, где
НачОстатокКол=([Период].CurrentMember.FirstSibling,[Measures].[Ostatok Kol])+sum([Период].CurrentMember.FirstSibling:[Период].CurrentMember,[Measures].[Prihod Kol]-[Measures].[Prodano Kol]-[Measures].[Vozvrat Kol])-([Measures].[Prihod Kol]-[Measures].[Prodano Kol]-[Measures].[Vozvrat Kol])
и
КонОстатокКол=([Период].CurrentMember.FirstSibling,[Measures].[Ostatok Kol])+sum([Период].CurrentMember.FirstSibling:[Период].CurrentMember,[Measures].[Prihod Kol]-[Measures].[Prodano Kol]-[Measures].[Vozvrat Kol])

пока так считаем
...
Рейтинг: 0 / 0
09.09.2005, 10:22
    #33260426
Владимир Штепа
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
расчет среднего остатка.
ВалекСрДневнОстатокКол=Avg(Descendants([Период],[Период].[День]), ([Measures].[НачОстатокКол]+[Measures].[КонОстатокКол])/2) считает средние остатки за период причем по дням, где
НачОстатокКол=([Период].CurrentMember.FirstSibling,[Measures].[Ostatok Kol])+sum([Период].CurrentMember.FirstSibling:[Период].CurrentMember,[Measures].[Prihod Kol]-[Measures].[Prodano Kol]-[Measures].[Vozvrat Kol])-([Measures].[Prihod Kol]-[Measures].[Prodano Kol]-[Measures].[Vozvrat Kol])
и
КонОстатокКол=([Период].CurrentMember.FirstSibling,[Measures].[Ostatok Kol])+sum([Период].CurrentMember.FirstSibling:[Период].CurrentMember,[Measures].[Prihod Kol]-[Measures].[Prodano Kol]-[Measures].[Vozvrat Kol])

пока так считаем

[Measures].[Ostatok Kol] это физическая мера? Какой тип аггрегации и какова гранулярность по времени?

в ваших расчетах используется двойное суммировние со всеми вытекающими последствиями в производительности.
...
Рейтинг: 0 / 0
09.09.2005, 10:37
    #33260498
Dmitry Biryukov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
расчет среднего остатка.
Я так понял, что проблема только в производительности, т.к. составить формулу или запрос проблем не вызывает.
есть идея попробовать комбинированный подход и усовершенствовать ф-лу zmikа
но "select sum(qty) as s, date group by date" выполнять к olap linked server
а day_number_of_year(date) = DATEDIFF (d,'01.01.2005',date)+1
...
Рейтинг: 0 / 0
09.09.2005, 10:41
    #33260527
Владимир Штепа
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
расчет среднего остатка.
Dmitry BiryukovЯ так понял, что проблема только в производительности, т.к. составить формулу или запрос проблем не вызывает.

Конечно в ней родимой вся заковырина, ибо если бы она нас не трогала, то считали бы мы в столбик на бумаге в клеточку или на счетах на худой конец.
...
Рейтинг: 0 / 0
09.09.2005, 10:52
    #33260588
Dmitry Biryukov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
расчет среднего остатка.
ну тогда я бы предложил хранить остатки на каждый день. но вы говорите это накладно... надо всё-таки выбирать между объёмом базы и временем отклика
...
Рейтинг: 0 / 0
09.09.2005, 11:19
    #33260675
Валек
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
расчет среднего остатка.
backfire ВалекСрДневнОстатокКол=Avg(Descendants([Период],[Период].[День]), ([Measures].[НачОстатокКол]+[Measures].[КонОстатокКол])/2) считает средние остатки за период причем по дням, где
НачОстатокКол=([Период].CurrentMember.FirstSibling,[Measures].[Ostatok Kol])+sum([Период].CurrentMember.FirstSibling:[Период].CurrentMember,[Measures].[Prihod Kol]-[Measures].[Prodano Kol]-[Measures].[Vozvrat Kol])-([Measures].[Prihod Kol]-[Measures].[Prodano Kol]-[Measures].[Vozvrat Kol])
и
КонОстатокКол=([Период].CurrentMember.FirstSibling,[Measures].[Ostatok Kol])+sum([Период].CurrentMember.FirstSibling:[Период].CurrentMember,[Measures].[Prihod Kol]-[Measures].[Prodano Kol]-[Measures].[Vozvrat Kol])

пока так считаем

[Measures].[Ostatok Kol] это физическая мера? Какой тип аггрегации и какова гранулярность по времени?

в ваших расчетах используется двойное суммировние со всеми вытекающими последствиями в производительности.

да физическая, MOLAP, на начало месяца, ну а что делать заказали самую среднюю и на начало дня и на конец дня чтоб учавствовали
...
Рейтинг: 0 / 0
09.09.2005, 11:30
    #33260723
Пашка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
расчет среднего остатка.
Умного ниче не скажу :), но согласен с Дмитрием.
Если физически не хранить на каждый день, то любое решение будет неудовлетворительным по времени отклика. Очень будет тормозить.
Я правда не знаю, сколько у вас транзакций, но, судя по тому, что хранить накладно - прилично транзакций.
...
Рейтинг: 0 / 0
09.09.2005, 12:00
    #33260847
Владимир Штепа
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
расчет среднего остатка.
ПашкаУмного ниче не скажу :), но согласен с Дмитрием.
Если физически не хранить на каждый день, то любое решение будет неудовлетворительным по времени отклика. Очень будет тормозить.
Я правда не знаю, сколько у вас транзакций, но, судя по тому, что хранить накладно - прилично транзакций.

Я бы не был таким таким пессимистичным, ибо на ум приходит следующее


Код: plaintext
1.
2.
[Средний остаток] = 
([Начальный остаток] * (Конец периода - Начало периода) + Sum([Движение]*(Конец периода - Дата движения)) / 
(Конец периода - Начало периода) 
...
Рейтинг: 0 / 0
09.09.2005, 12:37
    #33260970
vap
vap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
расчет среднего остатка.
Формула
автор[Средний остаток] =
([Начальный остаток] * (Конец периода - Начало периода) + Sum([Движение]*(Конец периода - Дата движения)) /
(Конец периода - Начало периода)
даст неправильный результат, тк чем старше движение тем больший весовой коэффициент у него. В формуле нужно оперировать остатками.
...
Рейтинг: 0 / 0
09.09.2005, 13:20
    #33261168
Беляев
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
расчет среднего остатка.
Господа, господа
Давайте термины уточним

Средний остаток - это просто, он считается

(Остаток на начало + Остаток на конец)/2

А вот вам похоже нужен среднесуточный остаток
Тогда что считать остатком за сутки остаток на начало, остаток на конец?
Или средний остаток за сутки ?

Среднесуточный остаток будет считаться как сумма остатков за сутки за период/ на число дней в периоде так ?

Имеем формулу:

Остаток на конец=Остаток на начало + Приход - Расход

Тогда суммарный остаток у нас будет

Сумма Остаток на начало

Но Остаток на начало следующего дня = Остаток на конец


То есть формула превращается в формулу zmike

S = (s*n + сумма по i от 1 до n ( si * (n-i+1) )) /n

Где s - остаток на начало
n - число дней в периоде

si приход за i день - расход за i день

Вот только предлагаю это в MDX считать, тогда надо просто довесок
si*(n-i+1) преобразовать так, чтобы использовать аггрегат по приходу, расходу


Владислав Беляев
...
Рейтинг: 0 / 0
09.09.2005, 13:21
    #33261172
Dmitry Biryukov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
расчет среднего остатка.
vapФормула
автор[Средний остаток] =
([Начальный остаток] * (Конец периода - Начало периода) + Sum([Движение]*(Конец периода - Дата движения)) /
(Конец периода - Начало периода)
даст неправильный результат, тк чем старше движение тем больший весовой коэффициент у него. В формуле нужно оперировать остатками. присмотритесь внимательнее. формула верна, и это разжевал zmike.
...
Рейтинг: 0 / 0
09.09.2005, 14:06
    #33261332
Владимир Штепа
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
расчет среднего остатка.
БеляевГоспода, господа
Давайте термины уточним

Средний остаток - это просто, он считается

(Остаток на начало + Остаток на конец)/2

Правильно, давайте уточним.

Есть Функция F(х). Среднее значение функции на интервале [x1;x2] есть
Определенный Интеграл F(х) от x1 до x2 разделить на (x2 - x1), если кто не помнит из курса алгебры и начал мат анализа (10-й класс советской школы).

А то что вы приводите как (Остаток на начало + Остаток на конец)/2 есть приближение 1-го порядка (линейное) или формула трапеций.

А та формула, что я предлагаю дает точный результат вне зависимости от того, что мы рассматриваем, год, неделю или день (если большой поток транзакций и нужно среднее в течении дня). Если к каждому движению есть время его совершения, то мы получам математически точное среднее без каких либо аппроксимаций.
...
Рейтинг: 0 / 0
09.09.2005, 16:29
    #33261810
zmike
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
расчет среднего остатка.
backfireЕсть Функция F(х). Среднее значение функции на интервале [x1;x2] есть
Определенный Интеграл F(х) от x1 до x2 разделить на (x2 - x1).

полностью согласен. только слово "функция" появиось только в последнем посте.

но если уж вспоминать о советской школе, а значит и о Большой советский энциклопендии

так если считать остатки набором чисел.... то много разных формул подойдет

а вообще средних бывает много, бывает еще "мода" (наиболее часто встречаемая величина), медиана (середина между max и min значаниями)


надеюсь это слишком сильно смаховало на флейм
...
Рейтинг: 0 / 0
09.09.2005, 17:07
    #33261913
Владимир Штепа
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
расчет среднего остатка.
zmike[quot backfire]но если уж вспоминать о советской школе, а значит и о Большой советский энциклопендии

так если считать остатки набором чисел.... то много разных формул подойдет

а вообще средних бывает много

...

надеюсь это слишком сильно смаховало на флейм

К флейму это и близко не было. Речь шла о быстром (но не грубом) вычислении среднего функции, в данном случае остатка, представленной не значениями, а производными.
...
Рейтинг: 0 / 0
09.09.2005, 17:52
    #33262016
zmike
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
расчет среднего остатка.
backfire zmike[quot backfire]но если уж вспоминать о советской школе, а значит и о Большой советский энциклопендии

так если считать остатки набором чисел.... то много разных формул подойдет

а вообще средних бывает много

...

надеюсь это слишком сильно смаховало на флейм

К флейму это и близко не было. Речь шла о быстром (но не грубом) вычислении среднего функции, в данном случае остатка, представленной не значениями, а производными.

на самом деле я описался и не написал "не"
то есть должно было быть

надеюсь это _не_ слишком сильно смаховало на флейм

и имел я ввиду свой пост.

что касается быстроты то все формулы как мне казалось считали все быстрее чем за 2 прохода. а если написать это в sql, и иметь среднее за год. то вполне можно это запустить ночью.

а что касается точности... то опять же IMHO формул по которым считать огромное кол-во, снаало надо чтоб те кто на них будет смотреть согласились и понимали сильные и слабые стороны осреднения. (не сомневаюсь, что это вы и так сделали (ете))
...
Рейтинг: 0 / 0
09.09.2005, 18:07
    #33262045
Владимир Штепа
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
расчет среднего остатка.
что касается быстроты то все формулы как мне казалось считали все быстрее чем за 2 прохода

у zmike sql c подзапросом (время выполнения пропорционально квадрату количества двидений)

у Валька MDX тоже с двойным суммированием, что тоже пропорционально квадрату количества движений.

я же вымучил формулу с одинарным суммированием. Правда как ее красиво оформить на MDX еще не додумался. Как на MDX datediff оформить ?
...
Рейтинг: 0 / 0
09.09.2005, 22:36
    #33262300
vap
vap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
расчет среднего остатка.
Господа, может формула должна выглядеть
автор[Средний остаток] =
([Начальный остаток] * (Конец периода - Начало периода) + Sum([Движение]*( Начало периода - Дата движения)) /
(Конец периода - Начало периода)
...
Рейтинг: 0 / 0
09.09.2005, 22:47
    #33262308
Владимир Штепа
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
расчет среднего остатка.
vapГоспода, может формула должна выглядеть
автор[Средний остаток] =
([Начальный остаток] * (Конец периода - Начало периода) + Sum([Движение]*( Начало периода - Дата движения)) /
(Конец периода - Начало периода)

А че гадать, возьмите или калькулятор или Excel и проверьте свими руками.

Или еще проще, представьте в уме две ситуации, когда одно единственное движение происходит
- в начале рассматриваемого периода
- в конце рассматриваемого периода
и как это отражается на среднем остатке за период.

И тогда вы поймете, что не
( Начало периода - Дата движения)

а
( Конец периода - Дата движения)
...
Рейтинг: 0 / 0
09.09.2005, 23:49
    #33262342
vap
vap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
расчет среднего остатка.
согласен, конец периода :)
...
Рейтинг: 0 / 0
10.09.2005, 00:22
    #33262354
Dmitry Biryukov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
расчет среднего остатка.
backfireу zmike sql c подзапросом (время выполнения пропорционально квадрату количества двидений)Она с двойным только если всё на скл делать. хотя можно и переписать:
select sum(qty*datediff(...)) as s, date group by date
backfire
я же вымучил формулу с одинарным суммированием. Правда как ее красиво оформить на MDX еще не додумался. Не факт, что суммирование будет одинарным. имхо, ваша формула и змика - одинаковые в плане порядка кол-ва операций
backfireКак на MDX datediff оформить? например завести свойство "номер дня" = datediff(d,'01.01.1900',datefield), а потом Time.Day.[2005.01.01].Properties("номер дня") - Time.Day.[2005.04.11].Properties("номер дня")
...
Рейтинг: 0 / 0
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / расчет среднего остатка. / 25 сообщений из 42, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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