PostgreSQL:有条件的Loop需要帮助

时间:2014-05-21 08:01:19

标签: postgresql

我不知道它是否可能,但我有一张包含许多条目的大桌子,我想将其分解。

此表名为Listen,它可以节省人们收听流的时间,并且可以这样工作:

如果有人在听,我们每隔30秒创建一个新条目,其值为listening_time n-1 + 30。 因此,如果某人正在听120秒我有4个条目(我将它分解,现在它只创建一个条目,但我有所有旧条目)。

我想做的事情是这样的:

select * 
from listen 
order by session_id asc, id asc
  • 保存第一个条目
  • 2d条目:if(listening_time(n)= listening_time((n-1)+30)更新最后一个条目 别的新条目。

我不知道怎么做if,否则为n和n-1,但我知道如何更新条目。

感谢。

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您希望在有人开始收听时进行录制,然后在收听会话仍然开启时每30秒更新一次。如果这是正确的并且您可以更改表结构,那么除了监听开始时间之外,我还会添加一个记录last_ping(或其他一些有用名称)的列。然后,每个听力会话都会在您的表格中有一条记录。

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

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();

这里的技巧是尝试使用session_id,id和listening_time插入记录。在触发器内部 - 在插入实际发生之前 - 尝试更新现有的侦听会话,如果成功,则更新last_ping时间并使插入失败(通过返回NULL)。如果没有要更新的当前会话,则让插入继续(通过返回NEW)。