【问题标题】:SQL query to report duration untill next log entrySQL 查询以报告直到下一个日志条目的持续时间
【发布时间】:2013-08-16 22:29:30
【问题描述】:

我正在使用 PostgreSql 并尝试为我的日志构建报告查询,但不幸的是没有成功... 基本上我有记录其他实体状态变化的 LOG 表。所以为了简单起见,假设它有列 STATUS 和 STATUS_CHANGE_DATE。现在,每次状态更改都会使用新状态和更改时间更新此日志记录表。我需要的是每个状态的持续时间和次数(相同的状态可以多次使用,例如从状态 1 到 2 然后回到 1)。我想为它构建一个视图,并通过将该视图权限映射到休眠实体来在我的 java 应用程序报告中使用。不幸的是,我对 sql 没有那么丰富的经验,所以也许有人可以给我一些提示,告诉我什么是最好的解决方案,因为我尝试了一些事情,但基本上不知道该怎么做。 假设我们有:

STATUS STATUS_CHANGE_DATE
1      2013 01 01
2      2013 01 03
1      2013 01 06
3      2013 01 07

我想要的结果将是一个表格,其中包含状态 1 和 2 次和 3 天的持续时间和状态 2 1 时间和 3 天的持续时间(假设状态 3 是结束(或关闭)并且它的持续时间不是必需的)。

有什么想法吗?

【问题讨论】:

  • 请提供样本结果以阐明您的要求。
  • 最简单的解决方案是使用LEAD() 函数来计算跨度;见这里:stackoverflow.com/questions/7974866/….
  • 认为您正在尝试将状态边缘列表(状态更改时的时间记录)转换为状态为特定值时的时间范围列表。你的解释很难理解,这里没有足够清晰的样本数据/预期结果信息,所以我只能猜测。

标签: sql postgresql reporting postgresql-9.2


【解决方案1】:

如果你的状态在每一行都在变化,你可以这样做

with cte as (
    select
        status,
        lead(status_change_date) over(order by status_change_date) as next_date,
        status_change_date
    from Table1
)
select
    status, count(*) as cnt,
    sum(next_date - status_change_date) as duration
from cte
where next_date is not null
group by status

sql fiddle demo

【讨论】:

    【解决方案2】:

    试试这个:

    SELECT "STATUS", "STATUS_CHANGE_DATE" - lag("STATUS_CHANGE_DATE") OVER (ORDER BY "STATUS_CHANGE_DATE") AS "DURATION" FROM table ORDER BY "STATUS";
    

    这在类似情况下对我有用,在我的情况下,我需要计算日志表中会话之间的平均时间。我希望这对你有用。

    【讨论】:

      猜你喜欢
      • 2014-08-05
      • 2010-09-25
      • 1970-01-01
      • 2010-12-09
      • 2011-10-07
      • 1970-01-01
      • 2015-05-01
      • 2013-12-05
      • 1970-01-01
      相关资源
      最近更新 更多