Комплексная группировка по запросу (рекурсивно?) - PullRequest
0 голосов
/ 09 октября 2010

извините за заголовок, но я не знаю, как мне его назвать.Я использую PostgreSQL 8.3 и подойдет для запросов, не относящихся к ANSI.

Предположим, эта схема:

TimeEntries
id              - int
entry_date      - date
tracked_seconds - int
project_id      - int

projects
id              - int
name            - string
path            - string

Проекты являются иерархическими, меня не волнует parent_id и т. Д.Я выбрал столбец пути, пример:

Renovate Home    - path = renovate-home
- Clean Kitchen  - path = renovate-home/clean-kitchen

Я хочу запрос, который возвращает следующее:

date - project_path - tracked_seconds(this project) - tracked_seconds (total of self and child projects)

Группировка по дате и несколько раз для пути проекта, поэтому пример данных:

projects
name          path
Funny         funny
- Project     funny/project
-- Is Funny   funny/project/is-funny
Foo           foo
- Bar         foo/bar

Если сейчас есть TimeEntries для funny / project и foo / bar, и я выдаю этот запрос:

SELECT         entry_date, p.path as project_path, sum(tracked_seconds) / 60
FROM           time_entries te
LEFT JOIN      projects p on te.project_id = p.id
GROUP BY       entry_date, p.path

Я получаю такой результат:

entry_date        project_path           ?sum?
2010-10-01        funny/project          20
2010-10-01        foo/bar                10

Я хочу вот что:

entry_date        project_path           direct_sum     total
2010-10-01        funny                  0              20
2010-10-01        funny/project          20             20 
2010-10-01        foo                    0              10
2010-10-01        foo/bar                10             10

Ответы [ 2 ]

0 голосов
/ 21 ноября 2010

Вы застряли с 8.3 или можете обновить до 8.4?

Потому что с 8.4 я думаю, что это можно решить с помощью оконных функций:

SELECT te.entry_date, 
       te.tracked_seconds, 
       p.path, 
       sum(tracked_seconds) over (partition by (string_to_array(path, '/'))[1] order by entry_date asc, path desc)
FROM TimeEntries te
 JOIN projects p ON te.project_id = p.id
ORDER BY entry_date  
0 голосов
/ 09 октября 2010

Этот запрос должен приблизить вас к вашей цели:

SELECT         entry_date, p.path as project_path, p2.path, sum(tracked_seconds) / 60
FROM           time_entries te
LEFT JOIN      projects p on te.project_id = p.id
LEFT JOIN      projects p2 on p2.path LIKE p.path + '/%'
GROUP BY       entry_date, p.path, p2.path
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...