0

另一个新手 PostgreSQL 问题。

我有这样的事情:

CREATE TABLE user (
  userID bigserial primary key,
  name varchar(50) NOT NULL,
  created timestamp NULL DEFAULT CURRENT_TIMESTAMP
)
CREATE TABLE session (
  sessionID bigserial primary key,
  userID int NOT NULL,
  lastAction timestamp NULL DEFAULT NULL,
  created timestamp NULL DEFAULT CURRENT_TIMESTAMP
)

CREATE TABLE action (
  actionID bigserial primary key,
  sessionID int NOT NULL,
  lastAction timestamp NULL DEFAULT NULL,
  created timestamp NULL DEFAULT CURRENT_TIMESTAMP
)

一个用户可以有多个会话,每个会话都有多个会话操作。

每个用户都有过期的会话,在这种情况下会插入一个新的会话,并且他们采取的任何操作都会在此处进行编目。

我的问题是,我如何仅从他的会话中获取特定用户的操作,并且仅当它们发生在 1 天前、2 天前、一周前、一个月前或所有时间之前。

我查看了文档,我认为interval()这是我正在寻找的,但我只知道如何使会话过期:

(part of a join here) e.lastAction >= now() - interval '4 hours'

那个要么返回我需要的东西,要么不返回。但是如何让它返回自 1 天前、2 天前等以来创建的所有记录。SQL 语法和逻辑仍然有点混乱。

所以在一个理想的世界里,我想问这样一个问题,这个用户在 2 天内采取了多少行动?我创建了关系和时间戳,但我编写了一个失败的查询。

4

1 回答 1

1

我不确定您想要从actions表中获得哪个时间戳——创建的时间戳或最后一个操作的时间戳。在任何情况下,您想要的查询都是基本连接,您可以在其中过滤用户 ID 和时间戳:

 select a.*
 from actions a join
      sessions s
      on a.sessionid = s.sessionid
where s.userid = v_userid and
      a.created >= now() - interval '1 day';

如果您想要过去两天的交易数量,您可以使用聚合:

 select count(*)
 from actions a join
      sessions s
      on a.sessionid = s.sessionid
where s.userid = v_userid and
      a.created >= now() - interval '2 day';
于 2013-07-29T01:40:13.147 回答