2014-05-21 125 views
1

我不知道是否有可能,但我有一個有很多條目的大表,我想分解它。PostgreSQL:需要條件幫助

這臺被命名爲Listen,這樣可以節省時間的人正在聽一個流,它的工作原理是這樣的:

,如果有人在聽我們創造的每30秒與價值listening_time N-1 + 30的新條目 所以如果有人在聽120秒我有4個條目(我把它分解,現在它只創建一個條目,但我有所有舊條目)。

什麼,我希望做的是類似的東西:

select * 
from listen 
order by session_id asc, id asc 
  • 1項保存
  • 2D項:如果(listening_time(N)= listening_time((N-1)+ 30)更新最後一項 其他新的條目。

我不知道如何如果是n和n-1個做,其他人,但我知道如何更新條目。

謝謝。

+0

你在尋找一個'select'查詢來返回那個數據還是''update''語句實際上改變了數據?另外一些預期結果的樣本數據將會有所幫助。 –

+0

我嘗試更新表的條目少 – user3659739

回答

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)。