Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.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_Window Functions - Fatal编程技术网

Sql 选择使用另一行数据的查询

Sql 选择使用另一行数据的查询,sql,postgresql,window-functions,Sql,Postgresql,Window Functions,我有一个具有以下结构的表问题: +----+---------+-------------+------------+ | id | project | new_status | updated_at | +----+---------+-------------+------------+ | 1 | 1 | New | 12:41:18 | | 1 | 1 | In progress | 12:47:43 | | 1 | 1

我有一个具有以下结构的表问题:

+----+---------+-------------+------------+
| id | project | new_status  | updated_at |
+----+---------+-------------+------------+
| 1  | 1       | New         | 12:41:18   |
| 1  | 1       | In progress | 12:47:43   |
| 1  | 1       | Resolved    | 17:05:29   |
+----+---------+-------------+------------+
我需要实现一个查询,返回特定项目的每个问题在每个状态下花费的时间,类似于:

+----+---------+-------------+------------+
| id | project | new_status  | time_diff  |
+----+---------+-------------+------------+
| 1  | 1       | New         | 00:06:25   |
| 1  | 1       | In progress | 04:17:46   |
+----+---------+-------------+------------+

我怎么能得到这个?最好不要使用特殊的具体数据库特性,即只使用纯SQL。但如果有关系的话,我正在使用PostgreSQL。

可能是一个简单的第二个表,其中包含项目id、步骤名称、开始时间和停止时间。对步骤进行排序的某种方法,例如简单的数字序列。然后在项目id上的两个表之间运行联接,按步骤id排序,步骤的开始时间从结束时间中减去。使用case语句显示当前步骤没有结束时间。o

可能是一个简单的第二个表,其中包含项目id、步骤名称、开始时间和停止时间。对步骤进行排序的某种方法,例如简单的数字序列。然后在项目id上的两个表之间运行联接,按步骤id排序,步骤的开始时间从结束时间中减去。使用case语句显示当前步骤没有结束时间。o

我动态编写此查询,因此它不会被测试:

SELECT id, project, new_status, (updated_at - nextUpdate) AS time_diff
                           --or CAST((updated_at - nextUpdate) AS time) AS time_diff
FROM (
    SELECT *, 
        LEAD(updated_at) OVER (PARTITION BY project ORDER BY updated_at) AS nextUpdate
    FROM yourTable) dt
WHERE nextUpdate IS NOT NULL;

一个相关的答案是。

我动态地编写了这个查询,因此它没有经过测试:

SELECT id, project, new_status, (updated_at - nextUpdate) AS time_diff
                           --or CAST((updated_at - nextUpdate) AS time) AS time_diff
FROM (
    SELECT *, 
        LEAD(updated_at) OVER (PARTITION BY project ORDER BY updated_at) AS nextUpdate
    FROM yourTable) dt
WHERE nextUpdate IS NOT NULL;

相关答案是。

如果缺少下一步,则假设当前时区的当前时间:

SELECT *
FROM  (
   SELECT *, lead(updated_at, 1, now()::time(0)) OVER (PARTITION BY id, project
                                                       ORDER BY updated_at)
           - updated_at AS time_diff
   FROM   issue
   ) sub
WHERE  new_status <> 'Resolved'  -- hide 'Resolved' row
ORDER  BY updated_at;
您的示例显示了时间值,这通常是一个有问题的选择。如果事件跨越多天怎么办?考虑一下。


如果没有下一行或上一行,则可以提供默认值。我使用当前时间,不含小数秒。

如果缺少下一步,则假设当前时区的当前时间:

SELECT *
FROM  (
   SELECT *, lead(updated_at, 1, now()::time(0)) OVER (PARTITION BY id, project
                                                       ORDER BY updated_at)
           - updated_at AS time_diff
   FROM   issue
   ) sub
WHERE  new_status <> 'Resolved'  -- hide 'Resolved' row
ORDER  BY updated_at;
您的示例显示了时间值,这通常是一个有问题的选择。如果事件跨越多天怎么办?考虑一下。


如果没有下一行或上一行,则可以提供默认值。我使用当前时间,不使用小数秒。

因为您已经有一些使用lead函数的示例,这些函数肯定是特定于数据库的,所以这里有一个不同的选项:

此选项使用公共表表达式为每个项目创建一个使用行号的索引,然后基于该索引将表左键联接到自身;也就是说t2.ndx=t1.ndx+1

从这里开始,就需要计算时间差并将其格式化以供显示


如果您想查看问题在“已解决”状态下经过了多长时间,那么如果t2.updated_at为空,请使用coalescet2.updated_at、localtime之类的方法获取当前时间。

因为您已经有一些使用lead函数的示例,这些函数肯定是特定于数据库的,所以这里有一个不同的选项:

此选项使用公共表表达式为每个项目创建一个使用行号的索引,然后基于该索引将表左键联接到自身;也就是说t2.ndx=t1.ndx+1

从这里开始,就需要计算时间差并将其格式化以供显示


如果您想查看问题处于“已解决”状态已经过了多长时间,那么如果t2.updated_at为空,请使用coalescet2.updated_at、localtime之类的方法来获取当前时间。

一如既往,您的Postgres版本和您在psql中获得的\d问题的表定义应该是问题所在。示例数据很有用,但我们看不到数据类型和约束。并且您没有定义如何处理尚未解决的项目。与往常一样,您的Postgres版本和表定义在psql中遇到的问题应该是一个问题。示例数据很有用,但我们看不到数据类型和约束。并且您没有定义如何处理尚未解决的项目。窗口功能主管是标准SQL。在大型RDMS中,只有MySQL不支持它——这跟不上发展的步伐,它也不支持查询中的CTE。窗口函数的引导是标准SQL。在大型RDM中,只有MySQL不支持它——这跟不上发展的步伐,它也不支持查询中的CTE。