|
|
|
Пятничная задачка. Смотрим назад.
|
|||
|---|---|---|---|
|
#18+
Написать запрос, который для каждого adjusted value находит 1) предыдущее original (ordered by id) 2) original со сдвигом, который задается переменной (предыдущее считается со сдвигом 0) 3) число предыдущих original так чтоб их сумма не превышала заданный лимит Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Код: 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. Соединения и подзапросы не использовать. Правда мне надо было решить задачу для Impala 2.7, но может здесь кому-нибудь будет интересно. Первые два столбца считаются достаточно тривиально, третий чуть хитрее. Никакой закономерности в value а также зависимости value от id нет, это просто тестовые данные. ID уникальное. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2017, 08:12 |
|
||
|
Пятничная задачка. Смотрим назад.
|
|||
|---|---|---|---|
|
#18+
dbms_photoshop, пока осилил 1 и 2 Код: plsql 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2017, 09:30 |
|
||
|
Пятничная задачка. Смотрим назад.
|
|||
|---|---|---|---|
|
#18+
ORA__SQL, Да, зачетно. В Impala не поддерживается ignore nulls в lag, поэтому у меня было. Код: plsql 1. 2. 3. 4. 5. 6. Можно обойтись и без last_value ignore nulls, но не было необходимости. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2017, 09:51 |
|
||
|
Пятничная задачка. Смотрим назад.
|
|||
|---|---|---|---|
|
#18+
это же аналитические функции ? для решения ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2017, 10:42 |
|
||
|
Пятничная задачка. Смотрим назад.
|
|||
|---|---|---|---|
|
#18+
Что-то не особо энтузиазма. Открою карты. Для Oracle решается через pattern matching. Но решение чуть менее эффективное чем для PL/SQL поскольку в последнем случае сложность алгоритма линейная. Код: 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. 38. 39. 40. 41. 42. 43. 44. 45. На чистом SQL предлагается решить больше из спортивного интереса (и все-таки этот подход значительно лучше чем self join). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2017, 02:21 |
|
||
|
Пятничная задачка. Смотрим назад.
|
|||
|---|---|---|---|
|
#18+
dbms_photoshop, так и знал что ты смухлевал через pl\sql)) покажи через pattern matching решение, пожалуйста. у меня опять нет под рукой 12ой, а решение хочется осознать))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2017, 10:41 |
|
||
|
Пятничная задачка. Смотрим назад.
|
|||
|---|---|---|---|
|
#18+
не использовал этот инструмент, потому было интересно подумать над ним. у меня получилось вот так: не смог избавиться от склеивание лишних паттернов, через distinct , так как подсчитывается несколько вариантов сумма меньше заданной. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. с удовольствием посмотрю на авторское решение ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2017, 13:26 |
|
||
|
Пятничная задачка. Смотрим назад.
|
|||
|---|---|---|---|
|
#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. 38. 39. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2017, 16:48 |
|
||
|
Пятничная задачка. Смотрим назад.
|
|||
|---|---|---|---|
|
#18+
Будто бы вроде как должно бы, Диапазон по нарастающей сумме весьма изящно. Для импалы пока не допилили window clause как следует Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2017, 17:29 |
|
||
|
Пятничная задачка. Смотрим назад.
|
|||
|---|---|---|---|
|
#18+
Vintтак и знал что ты смухлевал через pl\sqlЯ смухлевал через другой язык программирования потому что надо было решать не для Оракла, а решение паттерн матчинг просто возникло в голове потому и создал тему. Вон ниже симпатично решили аналитикой. Вечером опубликую. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2017, 17:33 |
|
||
|
Пятничная задачка. Смотрим назад.
|
|||
|---|---|---|---|
|
#18+
Oracle настолько крут, что эта задача могла быть решена еще в конце прошлого века с выходом 8i. Код: 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. 38. 39. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2017, 21:36 |
|
||
|
Пятничная задачка. Смотрим назад.
|
|||
|---|---|---|---|
|
#18+
Возвращаясь к теме pattern matching. Первые два столбца могут быть посчитаны линейным проходом, когда все строки попадают под единственное совпадение. match_number = 1. Код: 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. 38. 39. 40. 41. Предыдущие оригинальные просто смотрятся путем применения функции last к правилу o. Можно пойти более извилистым путем (и менее эффективным) и строить совпадение для каждой adjusted строки пока не найдем три оригинальных. При таком подходе число совпадений будет равно числу строк. Код: 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. 38. 39. 40. 41. 42. 43. 44. 45. Этот же подход можно применить для получения третьего столбца. Только совпадение строим не по фиксированному числу строк, а по достижении необходимой суммы. Код: 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. 38. 39. 40. 41. 42. 43. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2017, 22:01 |
|
||
|
Пятничная задачка. Смотрим назад.
|
|||
|---|---|---|---|
|
#18+
dwpне использовал этот инструмент, потому было интересно подумать над ним. у меня получилось вот так: не смог избавиться от склеивание лишних паттернов, через distinct , так как подсчитывается несколько вариантов сумма меньше заданной. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. с удовольствием посмотрю на авторское решениеТут довольно много уточнений. В выделенном нет необходимости ибо оно всегда верно согласно сортировке. Вместо all rows per match лучше использовать one row per match и ключевые слова running/final в measures вместо distinct + keep и проч. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2017, 22:07 |
|
||
|
Пятничная задачка. Смотрим назад.
|
|||
|---|---|---|---|
|
#18+
Ну и про баги. nullif возвращает значение в два раза большее, хотя в 10053 он преобразован в case, который работает корректно. Код: 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. 38. 39. 40. 41. 42. 43. 44. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2017, 22:16 |
|
||
|
Пятничная задачка. Смотрим назад.
|
|||
|---|---|---|---|
|
#18+
dbms_photoshop, ты написал select ... order by id; - я прочитал как решение одним селектом. поэтому и было интересно. а магия данных меня не интересует... Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. это типовая задача в кредитных организациях на сумму остатка. и она не решается на чистом скуле даже двойной аналитикой) ну вернее я решения не знаю. за решения на match_recognize спасибо. буду учиться)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2017, 13:30 |
|
||
|
Пятничная задачка. Смотрим назад.
|
|||
|---|---|---|---|
|
#18+
Vint, Помимо уникальности ID мне стоило упомянуть положительность value. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2017, 13:33 |
|
||
|
Пятничная задачка. Смотрим назад.
|
|||
|---|---|---|---|
|
#18+
dbms_photoshop, с постоянно нарастающим итогом эта задача уже не так интересна) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2017, 13:38 |
|
||
|
Пятничная задачка. Смотрим назад.
|
|||
|---|---|---|---|
|
#18+
Vint, Как обычно детали решают какой в итоге инструмент использовать. :)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2017, 13:42 |
|
||
|
Пятничная задачка. Смотрим назад.
|
|||
|---|---|---|---|
|
#18+
dbms_photoshop, ессесно))) главное это как поставлена задача, а то я по привычке искал универсальное решение и вспомнил задачу о показе периодов овердрафта на карте. которую кстати так и не решил на чистом sql. хотя у меня в производстве и нет похожих задач. но чисто академически интересно было порешать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2017, 13:46 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39470921&tid=1885758]: |
0ms |
get settings: |
6ms |
get forum list: |
14ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
170ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
72ms |
get tp. blocked users: |
2ms |
| others: | 203ms |
| total: | 483ms |

| 0 / 0 |
