【问题标题】:Getting the cycle time of items in PostgreSQL获取 PostgreSQL 中项目的周期时间
【发布时间】:2022-01-24 11:25:45
【问题描述】:

我得到了一个数据表,其中记录了一些项目的历史记录。这些项目会随着时间的推移而发展,并会通过不同的状态,例如“提交”、“验证中”、“已完成”:

ID Modified Date Status
123 01.01.2021 12:01 Submitted
123 02.01.2021 12:02 In Verification
123 03.01.2021 12:03 Completed
345 06.01.2021 12:04 Submitted
345 04.01.2021 12:05 In Verification
345 19.01.2021 18:06 Completed

我想知道每个项目处于特定状态的天数。有没有办法用 PostgreSQL 做到这一点?

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    您可以使用解析功能LEAD()。在您的问题中不清楚状态是否遵循特定的工作流程或者它们没有意义,所以下面的查询是通用的。

    你可以这样做:

    select *,
      lead(modified_date) over(partition by id order by modified_date) 
      - modified_date as diff
    from t
    

    结果:

    id   modified_date             status           diff                               
    ---- ------------------------- ---------------- ---------------------------------- 
    123  2021-01-01T12:01:00.000Z  SUBMITTED        {"days":1,"minutes":1}             
    123  2021-01-02T12:02:00.000Z  IN_VERIFICATION  {"days":1,"minutes":1}             
    123  2021-01-03T12:03:00.000Z  COMPLETED        null                               
    345  2021-01-04T12:05:00.000Z  IN_VERIFICATION  {"days":1,"hours":23,"minutes":59} 
    345  2021-01-06T12:04:00.000Z  SUBMITTED        {"days":13,"minutes":2}            
    345  2021-01-19T12:06:00.000Z  COMPLETED        null                               
    

    请参阅DB Fiddle 的运行示例。

    【讨论】:

    • 不错的解决方案。我看到它在数据库小提琴中工作,但努力让它在我的真实数据库中工作。该代码被接受,但它总是为差异返回 NULL。
    • @RangaB。如果您可以在小提琴中演示您的特殊情况的简化版本,也许我们可以提供帮助。
    • 谢谢。错误在我这边,因为我的数据库中有错误的数据。我接受了你的回答。
    【解决方案2】:

    您可以使用窗口函数来访问以下行并计算 2 个字段之间的差异。 https://www.postgresqltutorial.com/postgresql-lead-function/

    未经测试,它应该看起来像这样:

    select *, 
    Datediff(dd,[Modified Date],lead([Modified Date],1,GETDATE()) 
    over 
    (order by ID, [Modified Date])) as [Days between]
    from log 
    order by ID, [Modified Date]
    

    这样,您就可以从实际行中的表中获得下一个值,并且可以使用它进行计算。对于默认值,实际使用日期,但您可以使用您想要的所有其他日期。

    【讨论】:

      猜你喜欢
      • 2010-10-19
      • 2023-03-22
      • 2021-06-18
      • 1970-01-01
      • 2011-11-11
      • 2011-09-14
      • 1970-01-01
      • 2015-11-26
      • 2020-01-20
      相关资源
      最近更新 更多