2015-09-08 116 views
0

我有用戶,他們跑,我有每圈的時間戳記錄。Postgres:找到時間戳行之間的最小差異

我想按最快圈數排序用戶。

的想法是用「滯後」的Postgres的功能,具有「GROUP BY user_ID的」

我試過的東西,但我不知道「滯後」好,而且我不能和窗函數(圈)與聚合函數(分鐘)工作

http://sqlfiddle.com/#!15/ec9dc/6

你有一個想法?

感謝

+1

我得到這個:http://sqlfiddle.com/#!15/ec9dc/6但時間戳混合在用戶之間 –

回答

2

如果你想通過你必須列user_id分割行的一圈持續時間訂購的用戶。否則,不同用戶的圈速時間會有所不同。

我已將您的示例代碼修改了一下:我刪除了一個時間戳,插入了兩次,然後引入了包含窗口函數rank()lag()的視圖。前者用於計算每個用戶的圈數,後者用於確定當前時間戳的前一個時間戳。

BEGIN; 

CREATE TABLE lap 
(
    user_id text, 
    timestamp timestamp without time zone 
); 

INSERT INTO lap VALUES 
    ('a', '2015-08-20 16:14:30.568'), 
    ('a', '2015-08-20 16:16:13.06'), 
    ('b', '2015-08-20 16:16:18.06'), 
    ('b', '2015-08-20 16:16:25.63'), 
    ('b', '2015-08-20 16:17:10.568'), 
    ('a', '2015-08-20 16:17:25.63'), 
    --('a', '2015-08-20 16:17:34.087'), -- Timestamp was inserted twice. 
    ('a', '2015-08-20 16:17:34.087'); 

CREATE OR REPLACE VIEW user_lap_duration AS 
    SELECT 
     user_id, 
     -1+rank() OVER w AS lap_nr, 
     lag(timestamp) OVER w AS timestamp_prev, 
     timestamp, 
     timestamp - lag(timestamp) 
      OVER w 
      AS lap_duration 
    FROM 
     lap 
     WINDOW w AS (PARTITION BY user_id ORDER BY timestamp); 

SELECT 
    user_id, 
    lap_nr, 
    lap_duration 
FROM 
    user_lap_duration 
WHERE 
    lap_nr <> 0 
ORDER BY 
    lap_duration; 

ROLLBACK; 

運行上面的代碼會生成以下輸出。

user_id | lap_nr | lap_duration 
---------+--------+-------------- 
b  |  1 | 00:00:07.57 
a  |  3 | 00:00:08.457 
b  |  2 | 00:00:44.938 
a  |  2 | 00:01:12.57 
a  |  1 | 00:01:42.492 
(5 rows)