代码之家  ›  专栏  ›  技术社区  ›  Mateusz Urbański

PostgreSQL中时间间隔的计算

  •  1
  • Mateusz Urbański  · 技术社区  · 6 年前

    在我的PostgreSQL数据库中,我有以下模式:

    CREATE TABLE programs (
        id integer,
        description text
    );
    
    CREATE TABLE public.messages (
        id integer,
        program_id integer,
        text text,
        created_at timestamp with time zone
    );
    
    INSERT INTO programs VALUES(1, 'Test program');
    
    INSERT INTO messages VALUES(1,1, 'Test message 1', now() - interval '7 days');
    INSERT INTO messages VALUES(2,1, 'Test message 2', now() - interval '4 days');
    INSERT INTO messages VALUES(3,1, 'Test message 3', now() - interval '1 days');
    

    我想计算 created_at 在消息表中。它应该这样工作:

    1. 计算间隙 创造在 第一条和第二条消息。
    2. 计算间隙 创造在 第二条和第三条消息。
    3. 根据这些值计算平均间隙。

    在PostgreSQL中有没有什么方法可以做到这一点?

    https://www.db-fiddle.com/f/gvxijmp8u6wr6mYcSoAeVV/0

    2 回复  |  直到 6 年前
        1
  •  1
  •   Lukasz Szozda    6 年前

    使用 LAG 加窗 AVG 要同时获得差异和平均差距:

    WITH cte AS (
      SELECT *, 
      created_at-LAG(created_at) OVER(PARTITION BY program_id ORDER BY created_at) gap
      FROM messages
    )
    SELECT *, AVG(gap) OVER(PARTITION BY program_id) AS avg_gap
    FROM cte;
    

    db<>fiddle demo

        2
  •  1
  •   Gordon Linoff    6 年前

    如果您想要消息之间的平均时间,就不需要求出连续的差异。只需查看最早和最新的消息:

    select program_id,
           (max(created_at) - min(created_at)) / nullif(count(*) - 1, 0)
    from messages
    group by program_id;