2015-09-08 117 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)