|
Переписать одним запросом
|
|||
---|---|---|---|
#18+
Всем добрый день. Досталась мне по наследству чудесная система. В ней используется Postgres 10.4. Есть в ней (примерно) такая таблица: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
И есть в этой чудесной системе в одной из хранимых процедур несколько десятков подряд идущих идентичных запросов: Код: sql 1. 2. 3. 4. 5. 6. 7.
Продажи товара, про который таблица, учитываются помесячно - относятся на 1-е число месяца. Идея понятна - если товар не продавался в каком-то месяце, установить его цену из предшествующего месяца. И так от сотворения мира, - ну то есть этой системы, - и до наших дней. Но есть вопросы. Во-первых, непонятно, зачем там подзапрос. Я правильно понимаю, что если переписать по-простому, по-рабоче-крестьянски Код: sql 1.
получим то же самое? Нет, ну я, конечно, проверил. Работает идентично. Но вдруг я чего-то не понимаю, вдруг у автора сего чуда были какие-то неведомые мне мотивы сделать так? Во-вторых. Время движется неумолимо вперед, и я чувствую, что с каждым прожитым месяцем необходимо добавлять по одному экземпляру запроса к имеющимся нескольким десяткам. В связи с этим у меня вопрос: как бы переписать это (последовательность из десятков идентичных запросов) одним запросом? Есть нюанс: за некоторые месяцы (их всего пара-тройка штук за все годы, но они есть) записи в таблице отсутствуют. Как я понимаю, эти месяцы становятся "непреодолимым барьером" - данные в своем неумолимом движении вперед не могут "перепрыгнуть" такую дырку. Это тоже необходимо учесть. Есть идеи? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2019, 10:32 |
|
Переписать одним запросом
|
|||
---|---|---|---|
#18+
"несколько десятков подряд идущих идентичных запросов" идентичный - тождественный, полностью совпадающий. Т.е. несколько десятков абсолютно одинаковых запросов? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2019, 12:16 |
|
Переписать одним запросом
|
|||
---|---|---|---|
#18+
Именно. Несколько десятков подряд идущих абсолютно-абсолютно идентичных UPDATE-запросов. А почему такое удивление? Непонятен смысл этого? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2019, 12:27 |
|
Переписать одним запросом
|
|||
---|---|---|---|
#18+
Друзья, всем спасибо, кто мысленно помогал мне. :) При вашей мысленной поддержке у меня родился такой вариант: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Как я понял, "бесконечная" серия запросов в итоге приводит к тому, что для каждого месяца, в котором объемы продаж были нулевые, цена товара устанавливается равной цене товара в хронологически последнем из предшествующих месяцев, таких, что: - в этом месяце были ненулевые объемы продаж ИЛИ - для месяца, непосредственно предшествовавшего ему, в таблице нет записи. Это же самое я попытался реализовать в одном отдельном запросе. Ваше мнение? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2019, 13:11 |
|
Переписать одним запросом
|
|||
---|---|---|---|
#18+
Антипов Андрей Код: sql 1.
тут индекс не сработает ... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2019, 14:42 |
|
Переписать одним запросом
|
|||
---|---|---|---|
#18+
полудухтут индекс не сработает Это не страшно - записей в таблице всего несколько тысяч. Хуже другое. Я не смог прикрутить сюда "лишнее" условие исходного запроса, что заменяемое и заменяющее значения должны различаться. Код: sql 1.
С одной стороны, это не влияет на результат. С другой, это влияет на статистику - я хотел бы знать, сколько значений заменено. Мне важно убедиться, что суммарное количество значений, замененных за все шаги первого подхода, равно количеству значений, замененных в новом подходе за один запрос. Есть идеи, как допилить запрос? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2019, 17:24 |
|
Переписать одним запросом
|
|||
---|---|---|---|
#18+
Всем привет. Ну собственно вот он, конечный вариант с проверкой условия неравенства заменяемого и заменяющего значения. Вложенный запрос пришлось повторить: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Не очень эстетично, но вполне рабочий вариант. Есть идеи как сделать это компактнее? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2019, 11:43 |
|
|
start [/forum/topic.php?fid=53&fpage=43&tid=1995316]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
38ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
46ms |
get tp. blocked users: |
2ms |
others: | 283ms |
total: | 414ms |
0 / 0 |