Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
расчет среднего остатка.
|
|||
|---|---|---|---|
|
#18+
Избитая задача. Есть начальный остаток, есть все транзакции. Как рассчитать среднии остаток в течение года, если остаток на конец каждого дня не хранится (ибо сильно накладно). Где решать пофиг, хоть в SQL, хоть в OLAP ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2005, 21:28 |
|
||
|
расчет среднего остатка.
|
|||
|---|---|---|---|
|
#18+
Если иметь остаток на каждый день, остаток считается просто 1-й день - 30 2-й день - 20 3-й день - 20 4-й день - 30 ------------- средний остаток за 4 дня равен 100/4 = 25 единиц. Если есть остатки не на каждый день, появляется погрешность 1-й день - 30 4-й день - 30 ------------- средний остаток за 4 дня равен 60/2 = 30 единиц. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2005, 22:18 |
|
||
|
расчет среднего остатка.
|
|||
|---|---|---|---|
|
#18+
vapЕсли иметь остаток на каждый день, остаток считается просто 1-й день - 30 2-й день - 20 3-й день - 20 4-й день - 30 ------------- средний остаток за 4 дня равен 100/4 = 25 единиц. Если есть остатки не на каждый день, появляется погрешность 1-й день - 30 4-й день - 30 ------------- средний остаток за 4 дня равен 60/2 = 30 единиц. ну вы товарищъ америку открыли просто ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2005, 22:50 |
|
||
|
расчет среднего остатка.
|
|||
|---|---|---|---|
|
#18+
vapЕсли иметь остаток на каждый день, остаток считается просто 1-й день - 30 2-й день - 20 3-й день - 20 4-й день - 30 ------------- средний остаток за 4 дня равен 100/4 = 25 единиц. Если есть остатки не на каждый день, появляется погрешность 1-й день - 30 4-й день - 30 ------------- средний остаток за 4 дня равен 60/2 = 30 единиц. повторяю, что остаток хранится только на начало года(месяца) но не дня(ибо сильно накладно). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2005, 23:20 |
|
||
|
расчет среднего остатка.
|
|||
|---|---|---|---|
|
#18+
надеюсь что не открою Америки... есть такая идея... сейчас правда 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 ) хотя если честно я не уверен что так вообще можно писать :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2005, 00:47 |
|
||
|
расчет среднего остатка.
|
|||
|---|---|---|---|
|
#18+
СрДневнОстатокКол=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]) пока так считаем ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2005, 10:12 |
|
||
|
расчет среднего остатка.
|
|||
|---|---|---|---|
|
#18+
ВалекСрДневнОстатокКол=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] это физическая мера? Какой тип аггрегации и какова гранулярность по времени? в ваших расчетах используется двойное суммировние со всеми вытекающими последствиями в производительности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2005, 10:22 |
|
||
|
расчет среднего остатка.
|
|||
|---|---|---|---|
|
#18+
Я так понял, что проблема только в производительности, т.к. составить формулу или запрос проблем не вызывает. есть идея попробовать комбинированный подход и усовершенствовать ф-лу 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2005, 10:37 |
|
||
|
расчет среднего остатка.
|
|||
|---|---|---|---|
|
#18+
Dmitry BiryukovЯ так понял, что проблема только в производительности, т.к. составить формулу или запрос проблем не вызывает. Конечно в ней родимой вся заковырина, ибо если бы она нас не трогала, то считали бы мы в столбик на бумаге в клеточку или на счетах на худой конец. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2005, 10:41 |
|
||
|
расчет среднего остатка.
|
|||
|---|---|---|---|
|
#18+
ну тогда я бы предложил хранить остатки на каждый день. но вы говорите это накладно... надо всё-таки выбирать между объёмом базы и временем отклика ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2005, 10:52 |
|
||
|
расчет среднего остатка.
|
|||
|---|---|---|---|
|
#18+
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, на начало месяца, ну а что делать заказали самую среднюю и на начало дня и на конец дня чтоб учавствовали ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2005, 11:19 |
|
||
|
расчет среднего остатка.
|
|||
|---|---|---|---|
|
#18+
Умного ниче не скажу :), но согласен с Дмитрием. Если физически не хранить на каждый день, то любое решение будет неудовлетворительным по времени отклика. Очень будет тормозить. Я правда не знаю, сколько у вас транзакций, но, судя по тому, что хранить накладно - прилично транзакций. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2005, 11:30 |
|
||
|
расчет среднего остатка.
|
|||
|---|---|---|---|
|
#18+
ПашкаУмного ниче не скажу :), но согласен с Дмитрием. Если физически не хранить на каждый день, то любое решение будет неудовлетворительным по времени отклика. Очень будет тормозить. Я правда не знаю, сколько у вас транзакций, но, судя по тому, что хранить накладно - прилично транзакций. Я бы не был таким таким пессимистичным, ибо на ум приходит следующее Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2005, 12:00 |
|
||
|
расчет среднего остатка.
|
|||
|---|---|---|---|
|
#18+
Формула автор[Средний остаток] = ([Начальный остаток] * (Конец периода - Начало периода) + Sum([Движение]*(Конец периода - Дата движения)) / (Конец периода - Начало периода) даст неправильный результат, тк чем старше движение тем больший весовой коэффициент у него. В формуле нужно оперировать остатками. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2005, 12:37 |
|
||
|
расчет среднего остатка.
|
|||
|---|---|---|---|
|
#18+
Господа, господа Давайте термины уточним Средний остаток - это просто, он считается (Остаток на начало + Остаток на конец)/2 А вот вам похоже нужен среднесуточный остаток Тогда что считать остатком за сутки остаток на начало, остаток на конец? Или средний остаток за сутки ? Среднесуточный остаток будет считаться как сумма остатков за сутки за период/ на число дней в периоде так ? Имеем формулу: Остаток на конец=Остаток на начало + Приход - Расход Тогда суммарный остаток у нас будет Сумма Остаток на начало Но Остаток на начало следующего дня = Остаток на конец То есть формула превращается в формулу zmike S = (s*n + сумма по i от 1 до n ( si * (n-i+1) )) /n Где s - остаток на начало n - число дней в периоде si приход за i день - расход за i день Вот только предлагаю это в MDX считать, тогда надо просто довесок si*(n-i+1) преобразовать так, чтобы использовать аггрегат по приходу, расходу Владислав Беляев ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2005, 13:20 |
|
||
|
расчет среднего остатка.
|
|||
|---|---|---|---|
|
#18+
vapФормула автор[Средний остаток] = ([Начальный остаток] * (Конец периода - Начало периода) + Sum([Движение]*(Конец периода - Дата движения)) / (Конец периода - Начало периода) даст неправильный результат, тк чем старше движение тем больший весовой коэффициент у него. В формуле нужно оперировать остатками. присмотритесь внимательнее. формула верна, и это разжевал zmike. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2005, 13:21 |
|
||
|
расчет среднего остатка.
|
|||
|---|---|---|---|
|
#18+
БеляевГоспода, господа Давайте термины уточним Средний остаток - это просто, он считается (Остаток на начало + Остаток на конец)/2 Правильно, давайте уточним. Есть Функция F(х). Среднее значение функции на интервале [x1;x2] есть Определенный Интеграл F(х) от x1 до x2 разделить на (x2 - x1), если кто не помнит из курса алгебры и начал мат анализа (10-й класс советской школы). А то что вы приводите как (Остаток на начало + Остаток на конец)/2 есть приближение 1-го порядка (линейное) или формула трапеций. А та формула, что я предлагаю дает точный результат вне зависимости от того, что мы рассматриваем, год, неделю или день (если большой поток транзакций и нужно среднее в течении дня). Если к каждому движению есть время его совершения, то мы получам математически точное среднее без каких либо аппроксимаций. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2005, 14:06 |
|
||
|
расчет среднего остатка.
|
|||
|---|---|---|---|
|
#18+
backfireЕсть Функция F(х). Среднее значение функции на интервале [x1;x2] есть Определенный Интеграл F(х) от x1 до x2 разделить на (x2 - x1). полностью согласен. только слово "функция" появиось только в последнем посте. но если уж вспоминать о советской школе, а значит и о Большой советский энциклопендии так если считать остатки набором чисел.... то много разных формул подойдет а вообще средних бывает много, бывает еще "мода" (наиболее часто встречаемая величина), медиана (середина между max и min значаниями) надеюсь это слишком сильно смаховало на флейм ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2005, 16:29 |
|
||
|
расчет среднего остатка.
|
|||
|---|---|---|---|
|
#18+
zmike[quot backfire]но если уж вспоминать о советской школе, а значит и о Большой советский энциклопендии так если считать остатки набором чисел.... то много разных формул подойдет а вообще средних бывает много ... надеюсь это слишком сильно смаховало на флейм К флейму это и близко не было. Речь шла о быстром (но не грубом) вычислении среднего функции, в данном случае остатка, представленной не значениями, а производными. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2005, 17:07 |
|
||
|
расчет среднего остатка.
|
|||
|---|---|---|---|
|
#18+
backfire zmike[quot backfire]но если уж вспоминать о советской школе, а значит и о Большой советский энциклопендии так если считать остатки набором чисел.... то много разных формул подойдет а вообще средних бывает много ... надеюсь это слишком сильно смаховало на флейм К флейму это и близко не было. Речь шла о быстром (но не грубом) вычислении среднего функции, в данном случае остатка, представленной не значениями, а производными. на самом деле я описался и не написал "не" то есть должно было быть надеюсь это _не_ слишком сильно смаховало на флейм и имел я ввиду свой пост. что касается быстроты то все формулы как мне казалось считали все быстрее чем за 2 прохода. а если написать это в sql, и иметь среднее за год. то вполне можно это запустить ночью. а что касается точности... то опять же IMHO формул по которым считать огромное кол-во, снаало надо чтоб те кто на них будет смотреть согласились и понимали сильные и слабые стороны осреднения. (не сомневаюсь, что это вы и так сделали (ете)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2005, 17:52 |
|
||
|
расчет среднего остатка.
|
|||
|---|---|---|---|
|
#18+
что касается быстроты то все формулы как мне казалось считали все быстрее чем за 2 прохода у zmike sql c подзапросом (время выполнения пропорционально квадрату количества двидений) у Валька MDX тоже с двойным суммированием, что тоже пропорционально квадрату количества движений. я же вымучил формулу с одинарным суммированием. Правда как ее красиво оформить на MDX еще не додумался. Как на MDX datediff оформить ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2005, 18:07 |
|
||
|
расчет среднего остатка.
|
|||
|---|---|---|---|
|
#18+
Господа, может формула должна выглядеть автор[Средний остаток] = ([Начальный остаток] * (Конец периода - Начало периода) + Sum([Движение]*( Начало периода - Дата движения)) / (Конец периода - Начало периода) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2005, 22:36 |
|
||
|
расчет среднего остатка.
|
|||
|---|---|---|---|
|
#18+
vapГоспода, может формула должна выглядеть автор[Средний остаток] = ([Начальный остаток] * (Конец периода - Начало периода) + Sum([Движение]*( Начало периода - Дата движения)) / (Конец периода - Начало периода) А че гадать, возьмите или калькулятор или Excel и проверьте свими руками. Или еще проще, представьте в уме две ситуации, когда одно единственное движение происходит - в начале рассматриваемого периода - в конце рассматриваемого периода и как это отражается на среднем остатке за период. И тогда вы поймете, что не ( Начало периода - Дата движения) а ( Конец периода - Дата движения) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2005, 22:47 |
|
||
|
расчет среднего остатка.
|
|||
|---|---|---|---|
|
#18+
согласен, конец периода :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2005, 23:49 |
|
||
|
расчет среднего остатка.
|
|||
|---|---|---|---|
|
#18+
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("номер дня") ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2005, 00:22 |
|
||
|
|

start [/forum/topic.php?fid=49&msg=33262016&tid=1871067]: |
0ms |
get settings: |
10ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
52ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
85ms |
get tp. blocked users: |
2ms |
| others: | 283ms |
| total: | 472ms |

| 0 / 0 |
