|
Посчитать сумму периодов с учетом перекрытия
|
|||
---|---|---|---|
#18+
Необходимо вести посуточный учет подписок на внешнем сервисе. Статус подписки (активно/неактивно) ведется в "исторической" таблице (статус, дата_начала, дата_окончания). При первом подключении дается демо-период на 14 суток, демо-период нужно учитывать отдельно. Есть такой запрос: Код: plsql 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.
В подзапросе берутся данные за последний год, для месячного периода считается количество дней, в течении которых услуга была активна, затем во внешнем запросе эти данные группируются по типу подписки и только за последний месяц. Все работает, но есть один нюанс. Например услуга была активна в период с 1 по 14, а с 14 до 31 была неактивна. Число дней считаем как (14-1+1)=14 суток. Тут все правильно. Но возможны более сложные случаи. Например услуга была активна в период с 1 по 14, затем в середине дня она была отключена, а вечером снова включена до конца месяца. Тогда активные периоды получатся 1-14 и 14-31, а общая продолжительность соответственно 14 и 18 дней, суммарно 32 дня. То есть больше месяца, потому что 14 учитывалось дважды. Ранее в подобных случаях я обычно "разворачивал" периоды по суткам, оставлял сутки с активным состоянием, а затем группировал и суммировал. Но тут число строк с услугами/подписками ожидается большое, поэтому такой подход будет неоптимальным. Можно использовать аналитику, чтобы в подзапросе определять, имеются ли подобные "граничные" смены состояний, но как-то это сложновато. Можно ли исключить двойной подсчет во внешнем запросе (ориентируясь исключительно на PERIOD_BEG и PERIOD_END)? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2021, 12:43 |
|
Посчитать сумму периодов с учетом перекрытия
|
|||
---|---|---|---|
#18+
Alibek B., Код: plsql 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.
...... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2021, 13:02 |
|
|
start [/forum/topic.php?fid=52&fpage=25&tid=1880430]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
27ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
64ms |
get tp. blocked users: |
2ms |
others: | 14ms |
total: | 149ms |
0 / 0 |