代码之家  ›  专栏  ›  技术社区  ›  Zuenie

Postgresql计算记录之间的最小时间差

  •  -1
  • Zuenie  · 技术社区  · 5 年前

    我正在尝试创建一个产生时间差的函数。我首先要选择一个唯一的用户,然后为这个用户选择所有的记录,然后计算这些点和下一个点之间的时间差。它是按升序排列的,然后应该在一张桌子上结束

    id, user, time_read, timediff
    0, test, 2019-10-12 21:15:02.000000, 0 
    1, test, 2019-10-12 21:15:06.000000, 4 seconds
    2, test, 2019-10-12 21:15:19.000000, 13 seconds
    3, test, 2019-10-12 21:15:23.000000, 4 seconds
    etcetera
    
    
    CREATE TABLE newtable AS
        SELECT null::integer as id, null::character varying as aid,
               null::timestamp, null::interval as timediff;
    
    do $$
    declare
       i character varying;
       r mytable;
       e timestamp;
       counter integer := 0;
    begin
        for i in
            select distinct(aid) from mytable
        loop
            for r in
                select time_read from mytable
                where aid = i order by time_read asc
            loop
                for e in r
                    insert into newtable
                    counter, 
                        select aid, e,
                            e-sv.time_read::timestamp
                        from mytable as sv
                        where aid = i and e <> sv.time_read 
                        order by e-sv.time_read::timestamp
                        limit 1;
                    counter += 1;
            end loop;
        end loop;
        raise notice '%', i||tripcount::character varying;
    end; $$
    
    0 回复  |  直到 5 年前
        1
  •  1
  •   Adrian Klaver    5 年前

    WINDOW 功能:

    CREATE TABLE time_diff(id integer, "user" varchar, time_read timestamp);
    INSERT INTO time_diff VALUES (0, 'test', '2019-10-12 21:15:02.000000');
    INSERT INTO time_diff VALUES (1, 'test', '2019-10-12 21:15:06.000000');
    INSERT INTO time_diff VALUES (2, 'test', '2019-10-12 21:15:19.000000');
    INSERT INTO time_diff VALUES (3, 'test', '2019-10-12 21:15:23.000000');
    
    
    SELECT 
        id, "user", time_read, 
        COALESCE(time_read - LAG(time_read, 1) OVER(PARTITION BY user), '0') AS diff 
    FROM 
        time_diff 
    ORDER BY 
        time_read;
    
     id | user |      time_read      |   diff   
    ----+------+---------------------+----------
      0 | test | 10/12/2019 21:15:02 | 00:00:00
      1 | test | 10/12/2019 21:15:06 | 00:00:04
      2 | test | 10/12/2019 21:15:19 | 00:00:13
      3 | test | 10/12/2019 21:15:23 | 00:00:04