首页 > 解决方案 > 仅从本周获取记录

问题描述

我制作了一个不和谐的机器人,我在下表中记录了数据库中成员的贡献/帖子。

CREATE TABLE IF NOT EXISTS posts (
    id integer GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    ...
    post_date timestamptz NOT NULL DEFAULT CURRENT_TIMESTAMP
);

在每周结束时,我会手动运行一个命令来获取贡献更多的成员,这样我就可以给他/她一个奖励。为此,我创建了以下视图表,该表运行良好,因为它仅供个人使用,而且我每周都在同一日期进行。

CREATE VIEW vw_posts AS
    SELECT guild_id, account_id, COUNT(*) AS posts
    FROM public.posts
    WHERE post_date > CURRENT_TIMESTAMP - INTERVAL '1 week'
    GROUP BY(guild_id, account_id)
    ORDER BY posts DESC;

现在我正在执行一个新命令来显示每周排行榜。因此,在创建命令后,我很快意识到我的视图是以 7 天的间隔获取而不是获取当前周,因此它是从前一周获取数据。

小图更好解释

我得到了像红线一样的结果,但我希望视图充当绿线。

我做了一些研究,但大多数帖子都建议使用 date_trunc() 或类似的函数,这些函数不会让我得到其余的数据,即使在阅读了文档之后,我也肯定很难进行查询。

感谢您的任何建议!

标签: sqlpostgresql

解决方案


对于本周使用:

CREATE VIEW vw_posts AS
    SELECT guild_id, account_id, COUNT(*) AS posts
    FROM public.posts
    WHERE post_date >= DATE_TRUNC('week', CURRENT_TIMESTAMP)
    GROUP BY guild_id, account_id
    ORDER BY posts DESC;

前一周:

CREATE VIEW vw_posts AS
    SELECT guild_id, account_id, COUNT(*) AS posts
    FROM public.posts
    WHERE post_date >= DATE_TRUNC('week', CURRENT_TIMESTAMP) - INTERVAL '1 week' AND
          post_date < DATE_TRUNC('week', CURRENT_TIMESTAMP) 
    GROUP BY guild_id, account_id
    ORDER BY posts DESC;

推荐阅读