Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL查询以报告持续时间直到下一个日志条目_Sql_Postgresql_Reporting_Postgresql 9.2 - Fatal编程技术网

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

SQL查询以报告持续时间直到下一个日志条目,sql,postgresql,reporting,postgresql-9.2,Sql,Postgresql,Reporting,Postgresql 9.2,我正在使用PostgreSql并尝试为我的日志构建报告查询,但不幸的是没有成功。。。 基本上我有一个记录其他实体状态变化的日志表。因此,为了简单起见,我们假设它有STATUS和STATUS\u CHANGE\u DATE列。现在,每次状态更改都会使用新的状态和更改的时间更新此日志记录表。我需要的是每个状态的持续时间和状态在其中的次数(相同的状态可以多次使用,例如从状态1到2,然后返回到1)。我想为它构建一个视图,并通过将该视图映射到hibernate实体来在java应用程序报告中使用它。不幸的是

我正在使用PostgreSql并尝试为我的日志构建报告查询,但不幸的是没有成功。。。 基本上我有一个记录其他实体状态变化的日志表。因此,为了简单起见,我们假设它有STATUS和STATUS\u CHANGE\u 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,持续时间为1次,持续时间为3天(假设状态3为结束(或结束),并且不需要持续时间)

有什么想法吗?

试试这个:

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

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

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

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

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