是否有可能根据同一栏目中出现的时间差异来计算每天的总时数?

date time
2017-11-08 08:25:57
2017-11-08 12:31:59
2017-11-08 13:28:42
2017-11-08 17:34:13
2017-11-09 08:28:08
2017-11-09 12:31:15
2017-11-09 13:20:13

使用下面的查询,我可以获得enditime和Startime的单独数据:

SELECT MAX(time) AS "endtime",
       MIN(time) AS "startime",
       MAX(time)-MIN(time) as "totalneedtocalculatepause"
WHERE (date = '2017-11-08'::date )
FROM history ts

但是缺少startpsuse和endpsuse:

endtime startime totalneedtocalculatepause
17:34:13 08:25:57 09:08:16

正确的顺序应该是:

day         startpause   starttime    endtime     endpause
2017-11-08: (12:31:59 - 08:25:57) + (17:34:13 - 13:28:42)

我使用的是PostgreSQL13.

推荐答案

假设您的记录是耦合的,并且连续的值表示开始-结束时间段,您可以使用ROW_NUMBER函数,除以2,并设置天花板,以标识对(分区).然后使用您的查询,同时对新生成的列进行分区.

WITH cte AS (
    SELECT *, CEIL((ROW_NUMBER() OVER(PARTITION BY date ORDER BY time)+1)/2) AS rn 
    FROM history
)
SELECT MAX(time) AS "endtime",
       MIN(time) AS "startime",
       CAST(MAX(time)-MIN(time) AS time) AS "totalneedtocalculatepause"
FROM cte
WHERE (date = '2017-11-08'::date)
GROUP BY rn

"Output":

endtime startime totalneedtocalculatepause
12:31:59 08:25:57 04:06:02
17:34:13 13:28:42 04:05:31

查看演示here.


如果您想要总体摘要,可以应用进一步的汇总:

WITH cte AS (
    SELECT *, CEIL((ROW_NUMBER() OVER(PARTITION BY date ORDER BY time)+1)/2) AS rn 
    FROM history
), cte2 AS (
    SELECT MAX(time) AS "endtime",
           MIN(time) AS "startime",
           CAST(MAX(time)-MIN(time) AS time) AS "totalneedtocalculatepause"
    FROM cte
    WHERE (date = '2017-11-08'::date)
    GROUP BY rn
)
SELECT MAX(endtime) AS "endtime",
       MIN(startime) AS "startime",
       CAST(SUM(totalneedtocalculatepause) AS TIME) AS "totalneedtocalculatepause"
FROM cte2

"Output":

endtime startime totalneedtocalculatepause
17:34:13 08:25:57 08:11:33

查看演示here.

Sql相关问答推荐

在SQL中向每个子字节组添加字节行

Postgres JSONB对象筛选

编写一个SQL查询来返回收视率较高的类型,并取这些收视率的平均值,我该如何做呢?

我怎样才能得到列值对应的最大值在另一个?

在SELECT中将日期格式转换为双周时段

在UNION查询中查找MIN

查找滑动窗口框架中的最大和最小列值

其中使用表名作为;行值;记录?

使用SQLAlchemy和Postgres数据库创建新行时,为什么我的创建日期比更新日期晚?

如何使用SQL将患者平均分配给他们所在地区的doctor

如何使用Informix创建一个临时表,将数据从根表导入并使用筛选条件

基于字符串的SQL查询

为什么在事务中未被后续使用的CTE执行SELECT...FOR UPDATE无效?

如何显示最常引用条目的详细信息

oracle中多行的跨日期范围的交集

如何将 CONCATENATED 值与临时表中的值匹配

获取 SQL Server 中每一行的两个-之间的文本

SELECT 用于 Parent、Children 和 ORDER BY [Order] 列

连接表时避免重复

具有关联统计信息 N+1 的 Rails 6 索引资源?