|
|
|
Получение динамики изменений определенного поля
|
|||
|---|---|---|---|
|
#18+
Хочу спросить совета. Если таблица клиентов CUSTOMERS(CUSTOMER_ID,...). Есть таблица услуг SERVICES(SERVICE_ID,CUSTOMER_ID,LOGIN,...,STATUS_ID), которые подключены клиентам. Есть версионная таблица статусов услуг, по которой можно получить статус на любой момент SERVICE_STATUS(SERVICE_ID,STATUS_ID,DATE_BEG,DATE_END). Мне нужно за 6 лет получить посуточный отчет с полями: дата, кол-во клиентов на начало периода, приток, отток, кол-во клиентов на конец периода. Клиентом считается клиент, у которого есть хотя бы одна услуга с положительным статусом (STATUS_ID>0). У каждого клиента в среднем по две услуги, общее количество клиентов можно принять за 5000, поэтому если просто построить таблицу на каждый день за 6 лет, то получится порядка 20кк записей и такое «лобовое» решение неразумно. Сравнивать я думаю не наборы услуг, а их количества: Код: plsql 1. 2. 3. 4. 5. 6. 7. В результате я получаю по каждому клиенту количество подключенных услуг и приток/отток могу определять по полю CNT_ON. Фактически мне нужно посчитать дельту между текущим и следующим днем по полю CNT_ON, положительную разницу записать в отток, отрицательную разницу записать в приток, и просуммировать по дням. Теперь я не могу решить, что делать дальше. Я вижу три варианта. 1. Формирую сводную таблицу на каждый день. Клиенты с CNT_ON>0 будут не все (оценочно около 4000), поэтому в этой таблице окажется около 8кк записей. Тоже не очень разумно, но уже более реально. 2. Считать дельту прямо в запросе, с помощью аналитической функции — что-то типа lead(sum(case when SS.STATUS_ID>0 then 1 end)) - sum(case when SS.STATUS_ID>0 then 1 end). 3. В цикле формировать посуточную сводную таблицу, но не за весь период, а за месяц, после чего посчитать дельту за месяц и начать следующую итерацию цикла. Какой вариант правильнее? ________________________ Мы смотрим с оптимизмом... ...в оптический прицел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2017, 23:25 |
|
||
|
Получение динамики изменений определенного поля
|
|||
|---|---|---|---|
|
#18+
По второму варианту составил такой запрос (потроха внутреннего запроса убрал). Код: 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. 29. 30. 31. 32. 33. 34. 35. 36. 37. На реальных данных за период в один месяц он выполняется около 8 секунд. Но прежде чем запускать запрос за 6 лет, хочу его показать, может быть я в запросе чего-нибудь недосмотрел. Ну и если возможно, хотелось бы избавиться от лишней вложенности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2017, 23:57 |
|
||
|
|

start [/forum/topic.php?fid=52&fpage=177&tid=1886485]: |
0ms |
get settings: |
9ms |
get forum list: |
17ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
48ms |
get topic data: |
9ms |
get forum data: |
6ms |
get page messages: |
35ms |
get tp. blocked users: |
1ms |
| others: | 237ms |
| total: | 370ms |

| 0 / 0 |
