|
дубли записей при использовании оконных функций
|
|||
---|---|---|---|
#18+
Есть таблица расходов COSTS Поля: ID - идентификатор записи REG_DATE - дата расхода SUMM - сумма расхода Мне нужно вывести агрегатную информацию в группировке по датам (за один день может быть несколько записей расходов): SELECT REG_DATE, COUNT(ID) OVER(PARTITION BY REG_DATE) COST_COUNT, MIN(SUMM) OVER(PARTITION BY REG_DATE) MIN_SUMM, MAX(SUMM) OVER(PARTITION BY REG_DATE) MAX_SUMM, SUM(SUMM) OVER(PARTITION BY REG_DATE) SUMM FROM COSTS Такой запрос задублирует информацию для каждой записи расхода. То есть, если есть 4 записи расходов за 2021-01-20, то запрос вернет 4 одинаковые записи за 2021-01-20 Дубли можно убрать вот таким запросом: SELECT * FROM ( SELECT ROW_NUMBER() OVER(PARTITION BY REG_DATE) ROW_NUM, REG_DATE, COUNT(ID) OVER(PARTITION BY REG_DATE) COST_COUNT, MIN(SUMM) OVER(PARTITION BY REG_DATE) MIN_SUMM, MAX(SUMM) OVER(PARTITION BY REG_DATE) MAX_SUMM, SUM(SUMM) OVER(PARTITION BY REG_DATE) SUMM FROM COSTS ) WHERE ROW_NUM = 1 Но можно ли как-то обойтись без вложенных запросов? DISTINCT не предлагать :) ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2021, 18:13 |
|
дубли записей при использовании оконных функций
|
|||
---|---|---|---|
#18+
scorpion235, GROUP BY в первом запросе не забыл?? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2021, 18:20 |
|
дубли записей при использовании оконных функций
|
|||
---|---|---|---|
#18+
scorpion235, Зачем здесь оконные функции? Код: sql 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2021, 18:20 |
|
дубли записей при использовании оконных функций
|
|||
---|---|---|---|
#18+
Шавлюк Евгений, не совсем презентабельный запрос написал. Сильно упростил Полная версия такая: Код: sql 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2021, 19:09 |
|
дубли записей при использовании оконных функций
|
|||
---|---|---|---|
#18+
Работает быстро, но хочется избавиться от вложенных запросов ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2021, 19:11 |
|
дубли записей при использовании оконных функций
|
|||
---|---|---|---|
#18+
scorpion235, оконные функции тут не нужны. Подзапросы с FIRST это вообще какая-то чепуха, можно заменить на EXISTS. Оставить обычный GROUP BY, а подзапросы вынести выше. Код: sql 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2021, 19:55 |
|
дубли записей при использовании оконных функций
|
|||
---|---|---|---|
#18+
scorpion235, в 4.0 можно ещё извернуться через LEFT JOIN LATERAL, тогда можно вовсе без группировки обойтись. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2021, 20:20 |
|
дубли записей при использовании оконных функций
|
|||
---|---|---|---|
#18+
Симонов Денис, Благодарю! Про LATERAL слышал ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2021, 21:04 |
|
дубли записей при использовании оконных функций
|
|||
---|---|---|---|
#18+
Симонов Денис, с LEFT JOIN LATERAL и без использования группировок производительность взлетела до небес Execute time = 0ms :) Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2021, 22:19 |
|
|
start [/forum/topic.php?fid=40&fpage=7&tid=1560053]: |
0ms |
get settings: |
12ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
30ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
54ms |
get tp. blocked users: |
2ms |
others: | 234ms |
total: | 367ms |
0 / 0 |