【问题标题】:How to get values from the previous row?如何从上一行获取值?
【发布时间】:2021-10-10 09:31:14
【问题描述】:

我有一张这样的桌子:

ID NUMBER TIMESTAMP
1 1 05/28/2020 09:00:00
2 2 05/29/2020 10:00:00
3 1 05/31/2020 21:00:00
4 1 06/01/2020 21:00:00

我想显示这样的数据:

ID NUMBER TIMESTAMP RANGE
1 1 05/28/2020 09:00:00 0 Days
2 2 05/29/2020 10:00:00 0 Days
3 1 05/31/2020 21:00:00 3,5 Days
4 1 06/01/2020 21:00:00 1 Days

因此处理第 1 个流程需要 3.5 天。

我试过了:

select a.id, a.number, a.timestamp, ((a.timestamp-b.timestamp)/24) as days 
from my_table a
left join (select number,timestamp from my_table) b 
on a.number=b.number

没有按预期工作。如何正确执行此操作?

【问题讨论】:

    标签: sql postgresql window-functions intervals postgresql-13


    【解决方案1】:

    使用window function lag()

    标准间隔输出:

    SELECT *, timestamp - lag(timestamp) OVER(PARTITION BY number ORDER BY id)
    FROM   tbl
    ORDER  BY id;
    

    如果您需要像示例中那样的十进制数:

    SELECT *, round((extract(epoch FROM timestamp - lag(timestamp) OVER(PARTITION BY number ORDER BY id)) / 86400)::numeric, 2) || ' days'
    FROM   tbl
    ORDER  BY id;
    

    如果您还需要显示“0 天”而不是像示例中的 NULL:

    SELECT *,  COALESCE(round((extract(epoch FROM timestamp - lag(timestamp) OVER(PARTITION BY number ORDER BY id)) / 86400)::numeric, 2), 0) || ' days'
    FROM   tbl
    ORDER  BY id;
    

    db小提琴here

    【讨论】:

      猜你喜欢
      • 2011-06-19
      • 2014-10-29
      • 2013-12-28
      • 2019-05-26
      • 1970-01-01
      • 1970-01-01
      • 2017-12-13
      • 2019-03-09
      • 1970-01-01
      相关资源
      最近更新 更多