PostgreSQL:需要条件循环的帮助吗

PostgreSQL:需要条件循环的帮助吗,postgresql,Postgresql,我不知道这是否可能,但我有一个包含许多条目的大表,我想将其分解 此表名为Listen,它节省了人们收听流的时间,其工作方式如下: 如果有人在听,我们每30秒创建一个新条目,值为监听时间n-1+30。 如果有人在听120秒,我有4个条目,我将其分解,现在它只创建了一个条目,但我有所有的旧条目 我想做的是这样的: select * from listen order by session_id asc, id asc 保存第一个条目 2d条目:如果侦听\u timen=侦听\u timen-1

我不知道这是否可能,但我有一个包含许多条目的大表,我想将其分解

此表名为Listen,它节省了人们收听流的时间,其工作方式如下:

如果有人在听,我们每30秒创建一个新条目,值为监听时间n-1+30。 如果有人在听120秒,我有4个条目,我将其分解,现在它只创建了一个条目,但我有所有的旧条目

我想做的是这样的:

select * 
from listen 
order by session_id asc, id asc
保存第一个条目 2d条目:如果侦听\u timen=侦听\u timen-1+30,则更新最后一个条目 否则,请输入新条目。 我不知道如何对该n和n-1执行if,else,但我知道如何更新条目


谢谢。

如果我理解正确,您希望录制某人开始收听的时间,然后在收听会话仍处于打开状态时每30秒更新一次。如果这是正确的,并且您可以更改表结构,那么除了侦听开始时间之外,我将添加一列来记录最后一次\u ping或其他一些有用的名称。然后,每个听力会话都会在您的表中有一条记录

您可以使用插入触发器自动执行此操作,如下所示:

CREATE FUNCTION listening () RETURNS trigger AS $$
BEGIN
  -- Try to update an existing session, set the last_ping column to the time provided.
  UPDATE listen SET last_ping = NEW.listening_time
  WHERE session_id = NEW.session_id
  AND id = NEW.id
  AND last_ping > NEW.listening_time - 30 seconds;

  -- If that worked, cancel the insert operation. Otherwise, the session is new or there
  -- is a new listening period so insert a new record, with last_ping set to listening_time.
  IF FOUND THEN
    RETURN NULL;
  ELSE
    NEW.last_ping := NEW.listening_time;
    RETURN NEW;
  END IF;
$$ LANGUAGE plpgsql;

CREATE TRIGGER before_insert_listen
  BEFORE INSERT ON listen
  FOR EACH ROW EXECUTE PROCEDURE listening();

这里的技巧是尝试插入一个带有会话id、id和监听时间的记录。在触发器内部-在插入实际发生之前-尝试更新现有的侦听会话,如果成功,将更新最后的\u ping时间,并通过返回NULL使插入失败。如果没有要更新的当前会话,则通过返回NEW继续插入。

您是在寻找返回该数据的select查询,还是寻找实际更改该数据的update语句?另外,一些具有预期结果的示例数据也会有所帮助