У меня есть таблица (в Postgres 9.1), которая выглядит примерно так:
CREATE TABLE actions (
user_id: INTEGER,
date: DATE,
action: VARCHAR(255),
count: INTEGER
)
Например:
user_id | date | action | count
---------------+------------+--------------+-------
1 | 2013-01-01 | Email | 1
1 | 2013-01-02 | Call | 3
1 | 2013-01-03 | Email | 3
1 | 2013-01-04 | Call | 2
1 | 2013-01-04 | Voicemail | 2
1 | 2013-01-04 | Email | 2
2 | 2013-01-04 | Email | 2
Я хотел бы иметь возможность просматривать общее количество действий пользователя с течением времени для определенного набора действий; например, звонки + электронная почта:
user_id | date | count
-----------+-------------+---------
1 | 2013-01-01 | 1
1 | 2013-01-02 | 4
1 | 2013-01-03 | 7
1 | 2013-01-04 | 11
2 | 2013-01-04 | 2
Чудовище, которое я создал до сих пор, выглядит так:
SELECT
date, user_id, SUM(count) OVER (PARTITION BY user_id ORDER BY date) AS count
FROM
actions
WHERE
action IN ('Call', 'Email')
GROUP BY
user_id, date, count;
Который работает для отдельных действий, но, кажется, ломается для нескольких действий, когда они происходят в один и тот же день, например, вместо ожидаемого 11
на 2013-01-04
мы получаем 9
:
date | user_id | count
------------+--------------+-------
2013-01-01 | 1 | 1
2013-01-02 | 1 | 4
2013-01-03 | 1 | 7
2013-01-04 | 1 | 9 <-- should be 11?
2013-01-04 | 2 | 2
Можно ли изменить мой запрос, чтобы решить эту проблему? Я попытался удалить группировку на count
, но Postgres, похоже, это не нравится:
column "actions.count" must appear in the GROUP BY clause or be used in an aggregate function LINE 2: date, user_id, SUM(count) OVER (PARTITION BY user... ^