我不知道它是否可能,但我有一张包含许多条目的大桌子,我想将其分解。
此表名为Listen
,它可以节省人们收听流的时间,并且可以这样工作:
如果有人在听,我们每隔30秒创建一个新条目,其值为listening_time n-1 + 30。 因此,如果某人正在听120秒我有4个条目(我将它分解,现在它只创建一个条目,但我有所有旧条目)。
我想做的事情是这样的:
select *
from listen
order by session_id asc, id asc
我不知道怎么做if,否则为n和n-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)。