Хлоп! Не делай этого !!! Не потому, что вы не можете делать то, что вы просите, а потому, что вам, вероятно, не следует делать то, что вы просите, таким образом. Я предполагаю, что причина того, что у вас есть date_field
в вашем примере, заключается в том, что у вас есть date_field
, привязанный к пользователю или другим метаданным.
Подумайте об этом: вы просите PostgreSQL сканировать 100% записей, относящихся к данному пользователю. Если это не разовая операция, вы почти наверняка не хотите этого делать. Если это однократная операция, и вы планируете кэшировать это значение в качестве метаданных, то кого волнует оптимизация? Пространство дешево и сэкономит вам кучу времени на выполнение в будущем.
Вы должны добавить 4x поля метаданных для каждого пользователя (или что бы то ни было), которые помогают суммировать данные. У вас есть два варианта, я позволю вам выяснить, как использовать это, чтобы сохранить исторические подсчеты, но вот простая версия:
CREATE TABLE user_counts_only_keep_current (
user_id , -- Your user_id
lifetime INT DEFAULT 0,
yearly INT DEFAULT 0,
monthly INT DEFAULT 0,
daily INT DEFAULT 0,
last_update_utc TIMESTAMP WITH TIME ZONE,
FOREIGN KEY(user_id) REFERENCES "user"(id)
);
CREATE UNIQUE INDEX this_tbl_user_id_udx ON user_counts_only_keep_current(user_id);
Установите некоторые хранимые процедуры, которые обнуляют отдельные столбцы, если last_update_utc
не соответствует текущему дню в соответствии с NOW()
. Вы можете проявить творческий подход отсюда, но увеличение количества таких записей будет правильным способом.
Обработка данных временных рядов в любой реляционной базе данных требует специальной обработки и обслуживания. Посмотрите на наследование таблиц в PostgreSQL, если вам нужно хорошее управление временными данными ... но на самом деле, не делайте того, что вы собираетесь делать со своим приложением, потому что это почти наверняка приведет к плохим вещам (тм).