|
|
|
Закрытие нескольких операций с критериями приоритета - запрос или цикл?
|
|||
|---|---|---|---|
|
#18+
Посоветуйте способ решения такой задачи. Есть клиенты, которым начисляются бонусные баллы. В некоторых случаях у начисленных бонусных баллов есть срок действия, после которого они «сгорают», если не будут использованы до этого момента. Когда бонусные баллы используются, то используются в первую очередь бонусные баллы с ближайшим сроком действия. Если таковых несколько, то в первую очередь используются бонусные баллы с минимальной суммой. Если же бонусных баллов со сроком действия не осталось, то используются бонусные баллы без ограничения срока действия. На примере это будет выглядеть примерно так: 01.01.2017: 0 баллов 02.01.2017: начисление 100 баллов без срока действия 05.01.2017: начисление 100 баллов сроком до 10.01.2017 06.01.2017: начисление 200 баллов сроком до 20.01.2017 07.01.2017: начисление 50 баллов сроком до 10.01.2017 08.01.2017: на счету 450 баллов, из которых 150 действуют до 10.01.2017 и 200 действуют до 20.01.2017 09.01.2017: использование 100 баллов: - используется 50/50 баллов со сроком действия до 10.01.2017 (зачисленных 07.01.2017) - используется 50/100 баллов со сроком действия до 10.01.2017 (зачисленных 05.01.2017) 10.01.2017: сгорают 50/100 баллов, на счету 300 баллов, из которых 200 действуют до 20.01.2017 Структура данных планируется примерно такая (sqlfiddle почему-то сломался, поэтому даю не ссылкой, а кодом): Код: 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. При использовании бонусов нужно зафиксировать эту операцию в журнале операций (insert с CHARGE_ID=5), затем использовать баллы с ближайшим сроком действия и с меньшей суммой. Возможно ли это сделать с помощью чистого SQL (выбор подходящих начислений с набегающим итогом и обновление выбранных строк)? Или целесообразнее это делать циклом в PL/SQL скрипте (хранимой процедуре)? ________________________ Мы смотрим с оптимизмом... ...в оптический прицел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2017, 10:17 |
|
||
|
Закрытие нескольких операций с критериями приоритета - запрос или цикл?
|
|||
|---|---|---|---|
|
#18+
Alibek B., Чисто теоретически а) выстраиваешь записи по порядку списания и суммируешь общее количество бонусов, если не хватает генеришь ошибку. б) строишь рекурсивный запрос списывая бонусы пока не упрешься в 0. в) строишь merge который пробегает по результату пункта б и приводит таблицу в соответствие с ним. Но я бы так делать не стал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2017, 10:36 |
|
||
|
Закрытие нескольких операций с критериями приоритета - запрос или цикл?
|
|||
|---|---|---|---|
|
#18+
Я думаю, что смогу составить запрос с результатами для списаний. А какие недостатки в этом способе по сравнению с циклом? Мне на ум пока приходит только сложность запроса и возможность допустить в нем ошибку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2017, 11:04 |
|
||
|
Закрытие нескольких операций с критериями приоритета - запрос или цикл?
|
|||
|---|---|---|---|
|
#18+
Alibek B.сложность запроса Распределение, разнесение, разбрасывание, FIFO, … ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2017, 11:10 |
|
||
|
Закрытие нескольких операций с критериями приоритета - запрос или цикл?
|
|||
|---|---|---|---|
|
#18+
Elic , спасибо, поизучаю. Я как раз не мог правильно сформулировать, как это называется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2017, 11:26 |
|
||
|
Закрытие нескольких операций с критериями приоритета - запрос или цикл?
|
|||
|---|---|---|---|
|
#18+
Alibek B.Мне на ум пока приходит только сложность запроса и возможность допустить в нем ошибку. Волков боятся в лес не ходить. :) По большому сложных проблем тут две: - удачная попутка списать одни и те же бонусы из параллельных запросов; - ошибка, но не у тебя, а внутри СУБД при комбинировании мегазапроса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2017, 11:33 |
|
||
|
|

start [/forum/topic.php?fid=52&fpage=180&tid=1886608]: |
0ms |
get settings: |
10ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
70ms |
get topic data: |
13ms |
get forum data: |
4ms |
get page messages: |
56ms |
get tp. blocked users: |
2ms |
| others: | 242ms |
| total: | 424ms |

| 0 / 0 |
