|
Группировка "непонятно каким методом"
|
|||
---|---|---|---|
#18+
Доброго времени суток. Помогите решить задачу одним запросом, пусть даже сложным. Имеется неких ряд чисел. Задача состоит в том, чтобы каждому числу присвоить номер группы (начиная с 1) по следующему принципу: последовательно (на каждом последующем шаге добавляется следующее в выборке число) считается среднее, как только отношение полученного среднего к предыдущему среднему превышает сколько-то %, получаем новую группу. Например: Условие: отклонение не может превышать 25% (точнее должно быть строго меньше). значение|группа 10, 1 11, 1 12, 1 13, 1 14, 1 15, 1 16, 1 17, 1 18, 1 19, 1 20, 1 60, 2 - пошла 2я группа, т.к. здесь отношение среднего = 25% 61, 2 - отношение среднего - 0,0083 - отсюда среднее считается уже не с начала выборки, а с начала текущей группы 500, 3 501, 3 зы. числа, конечно же, упорядочиваются. зыы. Очень не хочется писать процедуру, потому как это промежуточный этап: данные сюда будут приходить из другого запроса и дальше тоже где-то могут использоваться для дальнейшей группировки... Код: plaintext 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2008, 18:33 |
|
Группировка "непонятно каким методом"
|
|||
---|---|---|---|
#18+
Nrk значение|группа 10, 1 11, 1 12, 1 13, 1 14, 1 15, 1 16, 1 17, 1 18, 1 19, 1 20, 1 60, 2 - пошла 2я группа, т.к. здесь отношение среднего = 25% По моим подсчетам это 19.07692308/15.66666667 ~= 1.217675941 Ошибка в данных, в описании задачи или у меня в голове? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2008, 20:13 |
|
Группировка "непонятно каким методом"
|
|||
---|---|---|---|
#18+
andrey_anonymous По моим подсчетам это 19.07692308/15.66666667 ~= 1.217675941 Код: plaintext 1. 2.
А вообще, задачка любопытная. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2008, 20:30 |
|
Группировка "непонятно каким методом"
|
|||
---|---|---|---|
#18+
AK-74Uandrey_anonymous По моим подсчетам это 19.07692308/15.66666667 ~= 1.217675941 Код: plaintext 1. 2.
Да, проблема у меня в голове - я ввел элемент 23 :) Задачка тривиально решается на модельке, на обычной же аналитике - действительно, забавно. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2008, 20:34 |
|
Группировка "непонятно каким методом"
|
|||
---|---|---|---|
#18+
Код: plaintext 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. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2008, 21:01 |
|
Группировка "непонятно каким методом"
|
|||
---|---|---|---|
#18+
Never mind, missed "отсюда среднее считается уже не с начала выборки, а с начала текущей группы". SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2008, 21:03 |
|
Группировка "непонятно каким методом"
|
|||
---|---|---|---|
#18+
SY Код: plaintext 1. 2. 3.
Не сходиццо. Для последней строки даже магия исходных данных и та не сработала ;) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2008, 21:07 |
|
Группировка "непонятно каким методом"
|
|||
---|---|---|---|
#18+
andrey_anonymousSY Код: plaintext 1. 2. 3.
Не сходиццо. Для последней строки даже магия исходных данных и та не сработала ;) Не сходиццо, since, as I already mentioned, I missed "отсюда среднее считается уже не с начала выборки, а с начала текущей группы". Counting average "с начала выборки" усе сходиццо. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2008, 21:25 |
|
Группировка "непонятно каким методом"
|
|||
---|---|---|---|
#18+
SY Counting average "с начала выборки" усе сходиццо. Отношение текущего среднего к предыдущему среднему элементарно получается и на первом уровне вложенности. Попонятнее -как Код: plaintext 1. 2.
Код: plaintext 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2008, 22:07 |
|
Группировка "непонятно каким методом"
|
|||
---|---|---|---|
#18+
SY, andrey_anonymous Так мне-то надо с начала группы среднее считать, когда новая группа начинается... Для моей задачи, 500 и 501 - когда 500 начало группы - это "одно и то же", ну в смысле одна группа... Собсна, что-то подобное получалось и у меня, а уперся я, когда понял, что в самом нижнем окне надо указать окну, что надо начинать по новой среднее считать, по результатам верхнего запроса. %) Ну, всё равно спасибо за некоторые просветления - не до конца разбирался в параметрах order by для аналитики... А есть ещё идеи?.. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2008, 22:15 |
|
Группировка "непонятно каким методом"
|
|||
---|---|---|---|
#18+
NrkА есть ещё идеи?.. Сервер какой? На 10g достаточно просто реализуется моделькой. На аналитике 9i решить - интерес скорее спортивный нежели чем практический (она плохо приспособлена для организации рекурсивных связей), в реальной жизни проще всего pipelined присобачить. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2008, 23:28 |
|
Группировка "непонятно каким методом"
|
|||
---|---|---|---|
#18+
andrey_anonymousAK-74Uandrey_anonymous По моим подсчетам это 19.07692308/15.66666667 ~= 1.217675941 Код: plaintext 1. 2.
Да, проблема у меня в голове - я ввел элемент 23 :) Задачка тривиально решается на модельке, на обычной же аналитике - действительно, забавно. А можете показать решение на model?Хотелось бы поизучать данную фичу. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2008, 23:35 |
|
Группировка "непонятно каким методом"
|
|||
---|---|---|---|
#18+
andrey_anonymousNrkА есть ещё идеи?.. Сервер какой? На 10g достаточно просто реализуется моделькой. На аналитике 9i решить - интерес скорее спортивный нежели чем практический (она плохо приспособлена для организации рекурсивных связей), в реальной жизни проще всего pipelined присобачить. сервер 9ка, про pipelined почитаю... Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2008, 23:59 |
|
Группировка "непонятно каким методом"
|
|||
---|---|---|---|
#18+
Код: plaintext 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. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87.
Explanations: t1 - simply numbering rows by ascending val. t2 - for each row (start_rn) calculating average and pervious average for all rows starting row start_rn through the rest of the table (another word for rows >= start_rn) . t3 - for each row (start_rn) calculate last consecutive row (end_rn) when average change is < 25%. If all rows are within 25% end_rn is null. t4 - get first row for each group. Remember, end_rn for each row points us to the last row (or null for last group) in a group that starts with start_rn. This ensures "среднее считается уже не с начала выборки, а с начала текущей группы". SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2008, 01:27 |
|
Группировка "непонятно каким методом"
|
|||
---|---|---|---|
#18+
SY Код: plaintext 1. 2. 3.
Не первый же год замужем... P.S. Не за себя радею, а за дело общее :) ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2008, 09:12 |
|
Группировка "непонятно каким методом"
|
|||
---|---|---|---|
#18+
SY, спасибо Снимаю шляпу... ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2008, 10:41 |
|
Группировка "непонятно каким методом"
|
|||
---|---|---|---|
#18+
Elicвырезать эту грёбаную нумерацию?! P.S. Не за себя радею, а за дело общее :) Well, it is like warming up before the game . On a bit more serious note, "I'll take that under advisement": Код: plaintext 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. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63.
SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2008, 14:57 |
|
Группировка "непонятно каким методом"
|
|||
---|---|---|---|
#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. 40.
Первый элемент в группе можно определить как "last(val,1) is null" - то есть нет предыдущего либо как "count(*) = 1" либо иными способами. nvl2 вместо case не работает. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2020, 02:54 |
|
|
start [/forum/topic.php?fid=52&tid=1881535]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
43ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
61ms |
get tp. blocked users: |
1ms |
others: | 16ms |
total: | 167ms |
0 / 0 |