|
Получить предыдущее значение в выборке
|
|||
---|---|---|---|
#18+
Здравствуйте. На входе есть такая выборка: Код: plsql 1.
ID val 1 10 2 20 3 0 4 40 5 50 На выходе должно быть следующее: ID val 1 10 2 20 3 20 4 40 5 50 Если в отсортированной по полю ID выборке в поле val значение = 0, то нужно подставлять в него предыдущее значение поля val Причём таблица t - это не таблица, а огромный подзапрос, который не хотелось бы много раз повторять. Как такое можно осуществить? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2020, 16:24 |
|
Получить предыдущее значение в выборке
|
|||
---|---|---|---|
#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.
SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2020, 17:08 |
|
Получить предыдущее значение в выборке
|
|||
---|---|---|---|
#18+
Уточнение - нужно получить не предыдущее значение val, а предыдущее значение val, которое не равно 0. И для упрощения можно представить, что t - просто таблица, а не большой подзапрос, это не так важно. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2020, 17:23 |
|
Получить предыдущее значение в выборке
|
|||
---|---|---|---|
#18+
SY match_recognize( order by id measures last(non_zero.val) new_val all rows per match pattern(non_zero* zero*) define non_zero as val != 0, zero as val = 0 ) SY. Это какой то высший пилотаж из 12-й версии, а у меня 11-я, там нет match_recognize ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2020, 17:27 |
|
Получить предыдущее значение в выборке
|
|||
---|---|---|---|
#18+
verter а у меня 11-я, там нет match_recognize Я прекрасно помню что у тебя 11G, просто тебе даже после предыдущих ответов упорно не доходит как важно указывать версию особенно когда она не текущая. Tаким образом ты тратишь наше время. И в следующий раз приводи данные в виде CREATE TABLE + INSERT или WITH sample_data AS - форумчане не должны это за тебя делать. Код: 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.
Или model если ID идут подряд (model можно и если не подряд но тогда эффективней просто аналитикой): Код: 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.
SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2020, 17:48 |
|
Получить предыдущее значение в выборке
|
|||
---|---|---|---|
#18+
Код: plsql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2020, 18:09 |
|
Получить предыдущее значение в выборке
|
|||
---|---|---|---|
#18+
Кобанчег Код: plsql 1.
У nullif под капотом тот-же case, но соглашусь буковок меньше. Ну и обернуть в case желательно - незачем выполнять аналитику для строк где val != 0. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2020, 19:01 |
|
Получить предыдущее значение в выборке
|
|||
---|---|---|---|
#18+
SY, Аналитика "выполняется" для всех строк независимо от всяких кейсов. Рекомендую также подумать как она в принципе работает - что сортируется и сколько раз, как определяется окно по набору строк для каждой результирующей строки и т. д. Дабы избежать бесед про сферическую аналитику в вакууме можно посмотреть план или sql monitor. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2020, 21:29 |
|
Получить предыдущее значение в выборке
|
|||
---|---|---|---|
#18+
Прошу прощения, забыл указать версию оракла и with не сделал, не подумал совсем, в след. раз буду внимательнее. Спасибо за ответ! Вы используете аналитику, а если совсем по-простому, вот так: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8.
Понимаю, что не оптимально и медленно, но на небольших выборках правильно вроде бы? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2020, 00:59 |
|
Получить предыдущее значение в выборке
|
|||
---|---|---|---|
#18+
verter Понимаю, что не оптимально и медленно, но на небольших выборках правильно вроде бы? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2020, 07:39 |
|
|
start [/forum/topic.php?fid=52&msg=39918848&tid=1881623]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
45ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
others: | 17ms |
total: | 153ms |
0 / 0 |