|
Как правильно сгруппировать набор данных?
|
|||
---|---|---|---|
#18+
Есть набор данных, в которых есть столбец MOMENT (дата и время события) и столбец FN (некое число). Мне нужно сгруппировать этот набор и для каждой группы определить минимальную и максимальную дату. Группой является последовательность строк с нарастающим MOMENT и одинаковым FN. Например тут три группы: idmomentfn12019-01-011022019-01-021032019-01-032042019-01-042052019-01-0510 И соответственно мне нужно получить такой результат: fnminmax102019-01-012019-01-02202019-01-032019-01-04102019-01-052019-01-05 Для начала я нумерую строки: row_number() over(order by moment) А как затем пронумеровать или выделить группы? Ведь если просто использовать dense_rank, то для повторяющихся значений FN он даст повторяющиеся значения ранга. А если использовать lead, то я не знаю, как задать в условиях, что мне нужна запись не только со следующим номером, но и с таким же FN. Пока что у меня получилось такое: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9.
Но оно правильно работает только в том случае, если FN в разных группах не повторяются. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2019, 20:12 |
|
Как правильно сгруппировать набор данных?
|
|||
---|---|---|---|
#18+
STFF start_of_group ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2019, 20:16 |
|
Как правильно сгруппировать набор данных?
|
|||
---|---|---|---|
#18+
как то так Код: plsql 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2019, 20:20 |
|
Как правильно сгруппировать набор данных?
|
|||
---|---|---|---|
#18+
Попробовал так: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9.
Но видимо что-то неправильно. У меня должно быть три группы, а запрос возвращает две группы. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2019, 20:27 |
|
Как правильно сгруппировать набор данных?
|
|||
---|---|---|---|
#18+
Alibek B. Но видимо что-то неправильно. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2019, 20:36 |
|
Как правильно сгруппировать набор данных?
|
|||
---|---|---|---|
#18+
Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2019, 21:09 |
|
Как правильно сгруппировать набор данных?
|
|||
---|---|---|---|
#18+
Не осилил я аналитику. Тем более, что в примерах с start_of_group все те же многоэтажные вложенные подзапросы. Поэтому сделал по старинке: Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2019, 21:52 |
|
Как правильно сгруппировать набор данных?
|
|||
---|---|---|---|
#18+
AmKad match_recognize Впечатляет. Правда мне использовать это не получится из-за версии, но выглядит намного красивее моего способа. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2019, 22:03 |
|
Как правильно сгруппировать набор данных?
|
|||
---|---|---|---|
#18+
Alibek B. Не осилил я аналитику. Тем более, что в примерах с start_of_group все те же многоэтажные вложенные подзапросы. Поэтому сделал по старинке: ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2019, 23:09 |
|
Как правильно сгруппировать набор данных?
|
|||
---|---|---|---|
#18+
Alibek B. Не осилил я аналитику. Поэтому сделал по старинке: Код: plsql 1. 2. 3. 4.
"По старинке", блин По старинке это так: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
моделькой - можно вот так, хотя я бы поискал способ поинтереснее: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2019, 17:53 |
|
Как правильно сгруппировать набор данных?
|
|||
---|---|---|---|
#18+
Решил поиграться с аналитикой для составления оптимального плана без фактических замеров производительности. Если выкинуть результирующий order by, который призван гарантировать сортировку итогового результата, то у меня получилась пара window sort + window nosort: Код: 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. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2019, 18:51 |
|
Как правильно сгруппировать набор данных?
|
|||
---|---|---|---|
#18+
Уберем неявное преобразование: AmKad Код: plsql 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2019, 18:55 |
|
Как правильно сгруппировать набор данных?
|
|||
---|---|---|---|
#18+
andrey_anonymous По старинке это так: Это в примере у меня даты целочисленные и с интервалом в одни сутки. В рабочих данных это дата/время (несколько сотен строк в сутки), поэтому lag(fn) over(order by moment) работать не будет, нужна именно нумерация строк. То есть плюс один подзапрос. А вот это, честно говоря, не понял: andrey_anonymous select fn, moment, sum(sog) over(order by moment) gid -- назначаем группам идентификаторы Как это работает? Разве тут не нужен partition? andrey_anonymous моделькой - можно вот так, хотя я бы поискал способ поинтереснее: Можно пояснить второе правило? d_from ведь будет копироваться с предыдущей строки, а должен с начала группы. Или я что-то пропустил? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2019, 23:18 |
|
Как правильно сгруппировать набор данных?
|
|||
---|---|---|---|
#18+
Alibek B. Или я что-то пропустил? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2019, 07:54 |
|
Как правильно сгруппировать набор данных?
|
|||
---|---|---|---|
#18+
Alibek B. поэтому lag(fn) over(order by moment) работать не будет Вы ведь проверили это утверждение перед тем, как опубликовали, верно? Alibek B. andrey_anonymous select fn, moment, sum(sog) over(order by moment) gid -- назначаем группам идентификаторы Как это работает? Это работает ввиду умолчательной спецификации упорядоченного окна. Я не готов разжевывать прекрасно документированное поведение аналитических функций, поскольку разжевывать там особо нечего - просто прочтите вдумчиво. Alibek B. andrey_anonymous моделькой - можно вот так, хотя я бы поискал способ поинтереснее: d_from ведь будет копироваться с предыдущей строки, а должен с начала группы. Или я что-то пропустил? Будет копироваться. Для каждой строки с предыдущей. При этом моделька учтет зависимость порядка исполнения правила, что приведет к копированию первого в группе значения через все промежуточные в последнее. Общее замечание: когда я не понимаю "с ходу", как именно работает тот или иной финт ушами, я обычно исследую запрос по частям, рассматривая выборки от базового источника данных до последней группировки. Это позволяет, с одной стороны, лучше понять коллег, с другой - существенно реже вызывать у них гомерический хохот. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2019, 14:59 |
|
Как правильно сгруппировать набор данных?
|
|||
---|---|---|---|
#18+
andrey_anonymous Вы ведь проверили это утверждение перед тем, как опубликовали, верно? Действительно. Документацию LAG я читал изначально, видел что если offset не задан, то используется значение 1, но ошибочно решил, что offset задает разницу значений. Сейчас перечитал еще раз, offset задает позицию строки. В любом случае спасибо за пояснения. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2019, 15:51 |
|
|
start [/forum/topic.php?fid=52&msg=39908644&tid=1881706]: |
0ms |
get settings: |
8ms |
get forum list: |
10ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
66ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
others: | 15ms |
total: | 171ms |
0 / 0 |