Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Подскажите красивое решение
|
|||
|---|---|---|---|
|
#18+
Код: 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. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. Суть задачи такова. Есть некая таблица ProcessValue. В нее сохраняются значения некоторого процесса во времени: значения технологических параметров на некую точку времени. Нужно рассчитать некоторые значения по формулам на некоторые моменты времени. В расчете не должно быть пустых значений, т.е. нужно взять последнее значение параметра для расчета. Что-то типа такого Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. Но проблема в том что формула может быть любой, а значений можно быть очень много. Т.е. каждый раз выбирать максимум - довольно затратно по времени. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2018, 14:45 |
|
||
|
Подскажите красивое решение
|
|||
|---|---|---|---|
|
#18+
sanitar, можно как-то так, можно и формулу через динмику считать, можно и MAX через self join Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2018, 15:08 |
|
||
|
Подскажите красивое решение
|
|||
|---|---|---|---|
|
#18+
На выходе мне нужны примерно такие наборы данных: 20181001 00:01:00, Formulа1(p1,p2,p4) 20181001 00:02:00, Formulа1(p1,p2,p4) 20181001 00:03:00, Formulа1(p1,p2,p4) Чтобы в дальнейшем все это дело можно было группировать по меткам времени, ну и разные вычисления производить. Данных очень много, ну это могут быть десятки миллионов. Я думаю для начала следует возможно как-то хранить этот мегамассив только по изменению, т.е. для начала избавиться от дублирующих записей, если значение не менялось - то и вообще его не записывать. А вот дальше как быть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2018, 15:14 |
|
||
|
Подскажите красивое решение
|
|||
|---|---|---|---|
|
#18+
sanitarА вот дальше как быть?Что "дальше" ? Вопрос твой в чём ? "Дальше" пишешь 100500 функций, в каждой из которых реализуешь отдельную формулу, которую рассчитываешь, как выше показали. ... нуу или одну ХП Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2018, 16:36 |
|
||
|
Подскажите красивое решение
|
|||
|---|---|---|---|
|
#18+
sanitarНо проблема в том что формула может быть любой, а значений можно быть очень много. Т.е. каждый раз выбирать максимум - довольно затратно по времени. Вам надо формализовать задачу. Что значит "формула может быть любой"? Пока понятна только первая часть - вам нужны последнее значения из временного диапазона по каждому параметру. Если данных много может проще иметь табличку по параметрам, куда вставлять значения/дату при вставке в основную таблицу по какому то фильтру даты? Но это не подойдёт если у вас метки времени, на которые надо делать выборки, случайные, а не например конец/начало месяца/дня/часа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2018, 19:54 |
|
||
|
Подскажите красивое решение
|
|||
|---|---|---|---|
|
#18+
sanitar Данных очень много, ну это могут быть десятки миллионов. Я думаю для начала следует возможно как-то хранить этот мегамассив только по изменению, т.е. для начала избавиться от дублирующих записей, если значение не менялось - то и вообще его не записывать. А вот дальше как быть? Вы пробовали оценить количество дублей? Логика никак не зависит от факта записи значения, даже неизменившегося? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2018, 20:03 |
|
||
|
Подскажите красивое решение
|
|||
|---|---|---|---|
|
#18+
PizzaPizzasanitar Данных очень много, ну это могут быть десятки миллионов. Я думаю для начала следует возможно как-то хранить этот мегамассив только по изменению, т.е. для начала избавиться от дублирующих записей, если значение не менялось - то и вообще его не записывать. А вот дальше как быть? Вы пробовали оценить количество дублей? Логика никак не зависит от факта записи значения, даже неизменившегося? Дублей по значениям может быть очень много. Во первых, есть такая проблема как "дребезг". Т.е. некоторое аналоговое значение, оно всегда меняется, т.к. связано с токовым значенем. Поэтому можно задать некоторый интервал допустимости дребезга, т.е считать что значение не изменилось в этих пределах и в дальнейшем его вообще не хранить. Вполне может быть следует дисперсию использовать или среднеквадратичное отклонение для этих целей. Кроме того, есть значения которые вводятся вручную по регламенту: ну скажем один раз в смену, сутки или месяц. Эти значения вообще нет смысла дублировать. При расчетах всегда берем последние - именно они считаются актуальными. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2018, 09:06 |
|
||
|
Подскажите красивое решение
|
|||
|---|---|---|---|
|
#18+
sanitar, 1. Необходимо изменить порядок столбцов в ПК ProcessValues на (ParmID, TimeKey) 2. Создаете функцию Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. Пример использования Код: sql 1. 3. Ищите или пишите самостоятельно функцию/процедуру для вычисления выражения. Или вычисляете на клиенте. Если совсем не волнует производительность и безопасность, то вот готовая - 21685462 Если сервер не поддерживает string_split, то на форуме есть полно примеров функций разбиения строки по разделителю. Возьмите любой понравившийся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2018, 10:44 |
|
||
|
Подскажите красивое решение
|
|||
|---|---|---|---|
|
#18+
invm, авторНеобходимо изменить порядок столбцов в ПК ProcessValues на (ParmID, TimeKey) я кончено понимаю зачем, но с точки зрения заполнения это будет огромная тошниловка ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2018, 10:46 |
|
||
|
Подскажите красивое решение
|
|||
|---|---|---|---|
|
#18+
Это задача для клиентского приложения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2018, 10:50 |
|
||
|
Подскажите красивое решение
|
|||
|---|---|---|---|
|
#18+
TaPaKс точки зрения заполнения это будет огромная тошниловкаЗависит от нагрузки. Если будет совсем плохо, то можно секционировать по ParamID или удвоить объем хранения, сделав дополнительный индекс для нужд читателей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2018, 11:08 |
|
||
|
Подскажите красивое решение
|
|||
|---|---|---|---|
|
#18+
TSQL настолько хорош, что всегда возникает соблазн перенести решения прикладного уровня на плечи ХП :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2018, 11:26 |
|
||
|
Подскажите красивое решение
|
|||
|---|---|---|---|
|
#18+
sanitarPizzaPizzaпропущено... Вы пробовали оценить количество дублей? Логика никак не зависит от факта записи значения, даже неизменившегося? Дублей по значениям может быть очень много. Во первых, есть такая проблема как "дребезг". Т.е. некоторое аналоговое значение, оно всегда меняется, т.к. связано с токовым значенем. Поэтому можно задать некоторый интервал допустимости дребезга, т.е считать что значение не изменилось в этих пределах и в дальнейшем его вообще не хранить. Вполне может быть следует дисперсию использовать или среднеквадратичное отклонение для этих целей. Кроме того, есть значения которые вводятся вручную по регламенту: ну скажем один раз в смену, сутки или месяц. Эти значения вообще нет смысла дублировать. При расчетах всегда берем последние - именно они считаются актуальными. Зависит конечно от того, как вы часто делаете выборки из этой таблицы, но я бы фильтровал неважные данные. Например при вставке вы сравниваете с предыдущим значением этого же параметра и вставляете только если проходит условие. Действительно, сделайте более селективный индекс по ParamId сначала. Дальше, как у же предложено, пивотом (если определенное количество ParamId) выбирается сет параметров и уже там не очень понятно в селекте ли у вас формула или же вам её передавать в запрос надо... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2018, 18:25 |
|
||
|
Подскажите красивое решение
|
|||
|---|---|---|---|
|
#18+
TaPaK, спасибо за идею с TIES. Очень помогло. В общем случае с вашей помощью я придумал примерно такое решение. Сейчас тестирую на реальном потоке данных. 1. Пишу в таблицу ProcessValues только изменившиеся значения, если значение не поменялось, то новая метка времени ему не присваивается. Количество записей при этом снизилось больше чем на порядок. 2. Поскольку каждый расчет у меня привязан к коммерческим суткам, то на начало суток я делаю проверку чтобы все данные имелись на начало с помощью метода, предложенного TaPaK. Если каких-то данных не хватает я их записываю принудительно. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 3. Подготовка к расчету. Если на какие-то метки данных идут пустые значения, я их "смазывю" с предудущих точек. Таким образом. Здесь пример для одного параметра. С помощью UNION в динамике можно склеить несколько, но обязательно для каждого задать интервал только на расчетные сутки, на начало суток мы гарантированно имеем значения см. п2. Код: 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. 4. Собственно сам расчет, тут обычные формулы. Ничего сложного. Вся проблема чтобы на каждую точку времени иметь все значения без "дыр". Не знаю насколько красивое решение. Сначала все кажется тривиальным, но когда начинаешь реализовывать, то понимаешь насколько все непросто, ну во всяком случае для меня. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2018, 08:45 |
|
||
|
Подскажите красивое решение
|
|||
|---|---|---|---|
|
#18+
Идею со "смазыванием" значений взял у " https://www.itprotoday.com/software-development/last-non-null-puzzle%22%5D%D0%97%D0%B4%D0%B5%D1%81%D1%8C]https://www.itprotoday.com/software-development/last-non-null-puzzle"]Здесь Еще нашел очень компактное интересное решение с Quirky UPDATE. Но там же пишут что куирки апдейт лучше не использовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2018, 08:59 |
|
||
|
|

start [/forum/topic.php?fid=46&fpage=131&tid=1688979]: |
0ms |
get settings: |
9ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
36ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
61ms |
get tp. blocked users: |
2ms |
| others: | 256ms |
| total: | 400ms |

| 0 / 0 |
