SQL查询报告持续时间直到下一次日志条目

时间:2013-08-16 22:29:30

标签: sql postgresql reporting postgresql-9.2

我正在使用PostgreSql并尝试为我的日志构建报告查询,但不幸的是失败了...... 基本上我有LOG表记录其他实体的状态变化。所以为了简单起见,我们假设它有列STATUS和STATUS_CHANGE_DATE。现在,每个状态更改都会使用新状态和更改时间来更新此日志记录表。我需要的是每个状态的持续时间和状态(相同的状态可以多次使用,例如从状态1到2然后再回到1)。我想为它构建一个视图,并通过将该视图映射到hibernate实体来在我的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次,持续时间为3天(假设状态3为结束(或关闭)且不需要持续时间)。< / p>

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

试试这个:

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

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

答案 1 :(得分: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