|
Firebird и функция StdDev
|
|||
---|---|---|---|
#18+
Привет всем. Возможно, у вас есть идеи, как из столбца с данными, вычислять значение функции STDDEV в новом столбце. Рассчитывается значение из последних 3 записей, включая текущую запись. Функция StdDev Модуль в Delphi: Math Описание Функция вычисляет стандартное среднеквадратичное отклонение (квадратный корень типовой дисперсии) значений массива чисел Data. Пример в Excel добавил. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2018, 15:28 |
|
Firebird и функция StdDev
|
|||
---|---|---|---|
#18+
24.10.2018 15:28, Irmantas Simaitis пишет: > Привет всем. Возможно, у вас есть идеи, как из столбца с данными, вычислять значение функции STDDEV в новом столбце. в FireBird 3.X есть Statistical Functions. смотри описание в документации. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2018, 15:36 |
|
Firebird и функция StdDev
|
|||
---|---|---|---|
#18+
Irmantas Simaitis, для FB 2.x - написать Stored Procedure в таблицу можно подключить, например, через авто-вычисляемые столбцы (Computed By) если сможете сформулировать там, что такое "три последние записи" для любой случайн овзятой строки. Только столбец этот не надо будет читать где угодно, а только там, гед роеально надо, иначе тормоза Вариант - создать реальный столбец и заполнять его на триггерах After insert or update or delete Но потребуется подумать, как правильно напистаь все триггеры, чтобы все зависимые строки во всех вариантах изменений исправлять ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2018, 18:58 |
|
Firebird и функция StdDev
|
|||
---|---|---|---|
#18+
AriochВариант - создать реальный столбец и заполнять его на триггерах After insert or update or delete Но потребуется подумать, как правильно напистаь все триггеры, чтобы все зависимые строки во всех вариантах изменений исправлять в многопользовательской среде не работоспособно ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2018, 19:01 |
|
Firebird и функция StdDev
|
|||
---|---|---|---|
#18+
Симонов Денис, почему? разве триггеры вне транзакций работают? всё зависит от соотношения как часто в эти столбцы пишут и как часто аггрегат вычитывают - т.е. где дороже лишний раз посчитать - на промежуточной записи или на повторном чтении .....а если бы у таблиц был ещё триггер before reading/selecting можно бы было и кэширующую схему создать Впрочем, её и так можно, через триггерных вьюхи ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2018, 13:33 |
|
Firebird и функция StdDev
|
|||
---|---|---|---|
#18+
Arioch, нет причина даже не в этом. 3 последних - это понятие сильно зависит от сортировки. В случае триггеров проблема в порядке вставки/обновления/удаления записей. Триггеры результат работы которых зависит от последовательности вставки/обновления/удаления в топку, даже в однопользовательском режиме. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2018, 13:53 |
|
Firebird и функция StdDev
|
|||
---|---|---|---|
#18+
насчёт вьюхи я погорячился, кэширование можно организовать даже в рамках одной таблицы. из триггеров заNULLяем столбец-кэш, а читаем из ещё одного COMPUTED BY столбца c ленивым восстановлением данных через SP Код: sql 1.
Симонов ДенисВ случае триггеров проблема в порядке вставки/обновления/удаления записей кто последний встал - того и тапки. какая последняя транзакция коммитится, данные той и попадают в последний запуск триггера, а предыдущие значения в тригеррах рассчитываются, конечно, но потом перезатираются ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2018, 14:44 |
|
Firebird и функция StdDev
|
|||
---|---|---|---|
#18+
Ariochпотребуется подумать, как правильно написaть все триггеры, чтобы все зависимые строки во всех вариантах изменений исправлять что это может потребовать serious thinking я сразу написал ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2018, 14:47 |
|
Firebird и функция StdDev
|
|||
---|---|---|---|
#18+
Arioch, дело не только в транзакции, но и в запросах вида INSERT... SELECT... которые позволяют вставлять записи пачками. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2018, 14:51 |
|
Firebird и функция StdDev
|
|||
---|---|---|---|
#18+
Ariochиз триггеров заNULLяем столбец-кэш, а читаем из ещё одного COMPUTED BY столбца c ленивым восстановлением данных через SP Код: sql 1.
Или даже, предполагая NULL валидным и достаточно распространённым значением, чтобы перерасчитыванием его нельзя было пренебречь, то два кэширующих столбца, значение и флаг валидности. Код: sql 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2018, 14:52 |
|
Firebird и функция StdDev
|
|||
---|---|---|---|
#18+
Симонов Дениспозволяют вставлять записи пачками. в FB триггеры работают per row, а не per statement - так какая разница для триггеров у меня один insert/update/merge на 10 записей, или 10 по одной записи ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2018, 14:53 |
|
Firebird и функция StdDev
|
|||
---|---|---|---|
#18+
Arioch, вот именно поэтому разница есть. Если SELECT не упорядочен будет случайная каша. И это только при одном пользователе. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2018, 14:57 |
|
Firebird и функция StdDev
|
|||
---|---|---|---|
#18+
Симонов ДенисЕсли SELECT не упорядочен будет случайная каша Будет, во время исполнения INSERT'a. А после его исполнения Ariochкто последний встал - того и тапки. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2018, 14:58 |
|
Firebird и функция StdDev
|
|||
---|---|---|---|
#18+
Arioch, ага, да с какого перепуга то. Собираешься пересчитывать на вставках значения в записях вставленных ранее? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2018, 15:01 |
|
Firebird и функция StdDev
|
|||
---|---|---|---|
#18+
Симонов Денис, Ну не на всех же, у нас скользящее окно. Irmantas Simaitisиз последних 3 записей, включая текущую запись. Агрегат считается только по первичке "соседей", поэтому изменения самого аггрегата никуда в другие строки не распространяются, только изменения первички. Поэтому наведённых изменений 2-го и т.д. уровня рекурсивности просто нет! Всё примитивно, хотя и не вполне эффективно. Допустим у нас есть строки. A B C D E F G H ... от строки D зависят строки с B по F {т.е. с Current ID +- (3-1) } Что мы можем сделать со строкой D ? 1) изменить значение (payload) - нужно инвалидировать или перерасчитать строки B - F 2) удалить вообще - то же самое 3) изменить ID ? отдельно не считается - это аналогично удалению+вставке Теперь имеем A B C E F G H ... и вставляем строку D, что надо делать? снова - пересчитать агрегат по строкам B-F Никаких других операций над таблицей не просматривается. Откуда возьмётся неконсистентность? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2018, 15:13 |
|
Firebird и функция StdDev
|
|||
---|---|---|---|
#18+
Arioch, ну я даже не знаю как тебе объяснить. Ещё раз ты внутри INSERT триггера собрался UPDATE соседних строк делать? А ничего что на UPDATE у тебя тоже триггеры есть. Даже если ты выпендришься и реализуешь такую хитрую схему пересчёта, то 1. Она будет работать не эффективно (ты уже сам заметил) 2. Будет провоцировать UPDATE конфликты, когда их не ждёшь. Что самое забавное даже на вставке записей 3. В случае ошибок этот чудесный клубок триггеров фиг распутаешь, чтобы понять в чём дело Так зачем советовать проктостоматологические методы? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2018, 15:22 |
|
Firebird и функция StdDev
|
|||
---|---|---|---|
#18+
Симонов Денисну я даже не знаю как тебе объяснить. как всегда - конкретным примером последовательности изменений, которая сломает такую схему Симонов ДенисА ничего что на UPDATE у тебя тоже триггеры есть абсолютно ничего AriochАгрегат считается только по первичке "соседей", поэтому изменения самого аггрегата никуда в другие строки не распространяются, только изменения первички. Поэтому наведённых изменений 2-го и т.д. уровня рекурсивности просто нет! Симонов ДенисОна будет работать не эффективно Как и всегда, зависит от соотношения чтений и записей. Если 1:1000 - то да, надо считать в SELECT'e и ничего нигде не хранить. А если 1000:1 - то наоборот. К вопросу что конкретно будет проктостоматологией - это тоже относится. Симонов ДенисБудет провоцировать UPDATE конфликты Почему ? В принципе кэширование можно и в отдельную таблицу вынести. Особенно, если базовая таблица уже широкая. Симонов ДенисВ случае ошибок этот чудесный клубок триггеров Так нет никакого клубка, есть только три триггера, ну или один универсальный. Самое сложное изменений - и то, ЕСЛИ такое разрешается, изменение ID у уже существующей записи. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2018, 15:32 |
|
Firebird и функция StdDev
|
|||
---|---|---|---|
#18+
AriochПочему ? Можешь на листочке расписать, когда 2 INSERT захотят сделать UPDATE одной и той же записи. Может тогда поймёшь. >> Никаких других операций над таблицей не просматривается. Откуда возьмётся неконсистентность? Неконситентность может и не возьмётся, а вот сильная разница в затронутых апдейтами записях в зависимости от порядка вставки ещё как. Т.е. реально не возможно предсказать сколько очередная вставка должна пересчитать записей. Хотя в консистентности сего решения я тоже не уверен. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2018, 15:54 |
|
Firebird и функция StdDev
|
|||
---|---|---|---|
#18+
Симонов Денискогда 2 INSERT захотят сделать UPDATE одной и той же записи. обычный конфликт изменений в двух транзакциях Симонов ДенисТ.е. реально не возможно предсказать сколько очередная вставка должна пересчитать записей от нуля до пяти (2*3-1), при этом на больших таблицах почти всегда будет 5 да, на 100% предсказать невозможно, ну и что? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2018, 16:58 |
|
Firebird и функция StdDev
|
|||
---|---|---|---|
#18+
Arioch, мне надоело с тобой спорить. Хочешь плодить у себя гавнокод пожалуйста, только не надо советовать другим. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2018, 17:08 |
|
Firebird и функция StdDev
|
|||
---|---|---|---|
#18+
Код: sql 1. 2.
ГДЕ обещанный конфлик на вставке, где ??? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2018, 17:11 |
|
Firebird и функция StdDev
|
|||
---|---|---|---|
#18+
Симонов Денис, ну то есть ты ляпнул абы что, ни одного примера хотя бы отдаленно проблемного за несколько часов придумать не смог, но указывать кому и что можно говорить будешь первым. Потому что ты художник, ты так видишь. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2018, 17:13 |
|
Firebird и функция StdDev
|
|||
---|---|---|---|
#18+
Arioch, ты в двух потоках запусти да ещё так чтобы id чередовались. UPDATE внутри одной транзакции одной и той же записи можно делать сколько угодно без всяких конфликтов. Ну и твой пример хрень полная. Где ID в случайном порядке? Где расчёт агрегата в зависимости от значения в текущей записи, а не просто +1. Какие-то id-2 id+2. Откуда уверенность что в id вообще нет пропусков? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2018, 17:21 |
|
Firebird и функция StdDev
|
|||
---|---|---|---|
#18+
Может быть ты сам наконец что-нибудь сделаешь? А если будут пропуски, то что изменится? > Где ID в случайном порядке? Где расчёт агрегата в зависимости от значения в текущей записи Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48.
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
P.S. массовые изменения данных из разных соединений в длинных транзакциях, которые чреваты конфликтом данным - это говнокод. Не надо такого другим советовать. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2018, 17:35 |
|
Firebird и функция StdDev
|
|||
---|---|---|---|
#18+
а также и на одном триггере Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
Код: plaintext 1. 2.
Код: sql 1. 2. 3.
Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2018, 17:45 |
|
|
start [/forum/topic.php?fid=40&fpage=29&tid=1560941]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
63ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
others: | 309ms |
total: | 469ms |
0 / 0 |