Postgres: подзапрос с GROUP BY - PullRequest
       1

Postgres: подзапрос с GROUP BY

0 голосов
/ 12 сентября 2018

Я пытаюсь оптимизировать запрос (вместо того, чтобы повторять его много раз) с помощью этого НЕ ФУНКЦИОНАЛЬНОГО КОДА выше (поскольку подзапросы возвращают только 1 столбец):

SELECT
    e.pageview_identifier,
    e.created_at,
    e.pageview_current_url,
    e.pageview_mobile,
    (
        SELECT event_type, COUNT(event_identifier)
        FROM events v
        WHERE
            v.company_identifier = e.company_identifier AND
            v.user_identifier = e.user_identifier AND
            v.pageview_identifier = e.pageview_identifier
        GROUP BY v.event_type
    )
FROM events e
WHERE
    company_identifier = 'xyz' AND
    user_identifier = '01CDQZVSJFBDA8W444JS2CS3BA' AND
    event_type = 'page:view';

В основном, я хочу получить столбцы как

pageview_identifier, created_at, ..., event_type_a_count, event_type_b_count, ...

A ФУНКЦИОНАЛЬНЫЙ код, который работает:

SELECT
    e.pageview_identifier,
    e.created_at,
    e.pageview_current_url,
    e.pageview_mobile,
    (
        SELECT COUNT(event_identifier)
        FROM events v
        WHERE
            v.company_identifier = e.company_identifier AND
            v.user_identifier = e.user_identifier AND
            v.pageview_identifier = e.pageview_identifier AND
            v.event_type = 'mouse:move'
    ) as mouse_move_count
FROM events e
WHERE
    company_identifier = 'xyz' AND
    user_identifier = '01CDQZVSJFBDA8W444JS2CS3BA' AND
    event_type = 'page:view';

Но в этом случае мне понадобитсяповторять много раз этот подзапрос для каждого вида event_type.

Редактировать 1 - Дополнительная информация:

В моем предложении WHERE я ограничиваю его только event_type = 'page:view'.У меня есть несколько возможных значений для event_type, и для каждого page:view мне нужно подсчитать связанные с ним события (с различными event_type) на основе условия e.pageview_identifier = v.pageview_identifier.

1 Ответ

0 голосов
/ 12 сентября 2018

Просто используйте оконную функцию:

    SELECT e.pageview_identifier,
           e.created_at,
           e.pageview_current_url,
           e.pageview_mobile,
           COUNT(*) OVER (PARTITION BY e.company_identifier, e.user_identifier, e.pageview_identifier) as cnt
    FROM events e
    WHERE e.company_identifier = 'xyz' AND
          e.user_identifier = '01CDQZVSJFBDA8W444JS2CS3BA' AND
          e.event_type = 'page:view';

Примечание. Считается только 'page:view' событий.Если вы хотите подсчитать каждое событие, то один из способов:

SELECT e.*
FROM (SELECT e.pageview_identifier,
             e.created_at,
             e.pageview_current_url,
             e.pageview_mobile,
             COUNT(*) FILTER (WHERE .event_type = 'mouse:move') OVER (PARTITION BY e.company_identifier, e.user_identifier, e.pageview_identifier) as cnt_mouse_move,
             COUNT(*) FILTER (WHERE .event_type = ''page:view'') OVER (PARTITION BY e.company_identifier, e.user_identifier, e.pageview_identifier) as cnt_page_view,
             . . .
      FROM events e
      WHERE e.company_identifier = 'xyz' AND
          e.user_identifier = '01CDQZVSJFBDA8W444JS2CS3BA' 
     ) e
WHERE e.event_type = 'page:view';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...