哎呀!不要这样做!!!不是因为你不能做你所要求的,而是因为你可能不应该以这种方式做你所要求的。我猜您date_field
在示例中出现的原因是因为您已date_field
附加到用户或其他一些元数据。
想一想:您要求 PostgreSQL 扫描与给定用户相关的 100% 的记录。除非这是一次性操作,否则您几乎肯定不想这样做。如果这是一次性操作,并且您计划将此值缓存为元数据,那么谁在乎优化?空间很便宜,并且可以为您节省大量的执行时间。
您应该为每个用户添加 4 个(或其他)元数据字段,以帮助汇总数据。你有两个选择,我会让你弄清楚如何使用它来保持历史计数,但这里是简单的版本:
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 的表继承......但实际上,不要对您的应用程序做任何事情,因为它几乎肯定会导致坏事(tm)。