如何对多个表中重叠的时间范围求和

2023-12-05

我有多个具有多个时间范围的表,当所有表重叠时,我需要计算重叠时间,但否则不需要计算。

在下面的示例中,我只需要对带有边框的时间范围进行时间求和:

enter image description here

不能只使用基本的 theta 连接,因为 A 并不总是 X 等。

示例表:

PLACE 1 PLACE 1 TIME IN     PLACE 1 TIME OUT    PLACE 2 PLACE 2 TIME IN     PLACE 2 TIME OUT    PLACE 3 PLACE 3 TIME IN     PLACE 3 TIME OUT
3929    2013-05-09 07:06:00.000 2013-05-09 08:29:00.000 3930    2013-05-09 07:06:00.000 2013-05-09 08:24:00.000 3931    2013-05-09 11:04:00.000 2013-05-09 12:16:00.000
3929    2013-05-09 07:06:00.000 2013-05-09 08:29:00.000 3930    2013-05-09 07:06:00.000 2013-05-09 08:24:00.000 3931    2013-05-09 08:49:00.000 2013-05-09 09:36:00.000
3929    2013-05-09 07:06:00.000 2013-05-09 08:29:00.000 3930    2013-05-09 07:06:00.000 2013-05-09 08:24:00.000 3931    2013-05-09 07:52:00.000 2013-05-09 08:21:00.000
3929    2013-05-09 07:06:00.000 2013-05-09 08:29:00.000 3930    2013-05-09 07:06:00.000 2013-05-09 08:24:00.000 3931    2013-05-09 09:57:00.000 2013-05-09 10:39:00.000
3929    2013-05-09 07:06:00.000 2013-05-09 08:29:00.000 3930    2013-05-09 15:06:00.000 2013-05-09 15:39:00.000 3931    2013-05-09 11:04:00.000 2013-05-09 12:16:00.000
3929    2013-05-09 07:06:00.000 2013-05-09 08:29:00.000 3930    2013-05-09 15:06:00.000 2013-05-09 15:39:00.000 3931    2013-05-09 08:49:00.000 2013-05-09 09:36:00.000
3929    2013-05-09 07:06:00.000 2013-05-09 08:29:00.000 3930    2013-05-09 15:06:00.000 2013-05-09 15:39:00.000 3931    2013-05-09 07:52:00.000 2013-05-09 08:21:00.000
3929    2013-05-09 07:06:00.000 2013-05-09 08:29:00.000 3930    2013-05-09 15:06:00.000 2013-05-09 15:39:00.000 3931    2013-05-09 09:57:00.000 2013-05-09 10:39:00.000
3929    2013-05-09 07:06:00.000 2013-05-09 08:29:00.000 3930    2013-05-09 11:22:00.000 2013-05-09 12:31:00.000 3931    2013-05-09 11:04:00.000 2013-05-09 12:16:00.000
3929    2013-05-09 07:06:00.000 2013-05-09 08:29:00.000 3930    2013-05-09 11:22:00.000 2013-05-09 12:31:00.000 3931    2013-05-09 08:49:00.000 2013-05-09 09:36:00.000
3929    2013-05-09 07:06:00.000 2013-05-09 08:29:00.000 3930    2013-05-09 11:22:00.000 2013-05-09 12:31:00.000 3931    2013-05-09 07:52:00.000 2013-05-09 08:21:00.000
3929    2013-05-09 07:06:00.000 2013-05-09 08:29:00.000 3930    2013-05-09 11:22:00.000 2013-05-09 12:31:00.000 3931    2013-05-09 09:57:00.000 2013-05-09 10:39:00.000
3929    2013-05-09 07:06:00.000 2013-05-09 08:29:00.000 3930    2013-05-09 12:52:00.000 2013-05-09 14:35:00.000 3931    2013-05-09 11:04:00.000 2013-05-09 12:16:00.000
3929    2013-05-09 07:06:00.000 2013-05-09 08:29:00.000 3930    2013-05-09 08:54:00.000 2013-05-09 11:02:00.000 3931    2013-05-09 11:04:00.000 2013-05-09 12:16:00.000
3929    2013-05-09 07:06:00.000 2013-05-09 08:29:00.000 3930    2013-05-09 12:52:00.000 2013-05-09 14:35:00.000 3931    2013-05-09 08:49:00.000 2013-05-09 09:36:00.000

好的,这是一个两步过程。首先,您要查找其他表中确实有重叠行的行。

用于查找两个范围之间重叠的古老技术是,仅当范围 A 的开头不晚于范围 B 的结尾且范围 A 的结尾不早于范围 B 的开头时,才存在重叠。

换句话说,如果 B 在 A 结束之前开始,并且 B 也在 A 开始之后结束,则存在重叠。

现在如何在 SQL 中表达这一点:从“根”表开始,将其作为 FROM 子句中的第一个表。我们将其称为 Table1,其中包含 A 列和 B 列(来自您的图像)。

要查找其他两个表中存在重叠的行,请像这样进行 JOIN:

FROM Table1 t1
INNER JOIN Table2 t2
  ON t2.E <= t1.B AND t2.F >= t1.A
INNER JOIN Table3 t3  --this table has to overlap both of the others
  ON t3.X <= t1.B AND t3.Y >= t1.A
  AND t3.X <= t2.F AND t3.Y >= t2.E

通过使用 INNER JOIN,所有三个表中没有重叠的行都将被排除在考虑范围之外。

然后仅返回重叠的周期,获取 MAXt1.A, t2.E, t3.X作为重叠的开始,并且 MINt1.B, t2.F, t3.Y作为重叠的结束。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何对多个表中重叠的时间范围求和 的相关文章

  • SSRS报告不显示数据

    我刚刚创建了 SQL Server 2005 SSRS 报告 数据未显示在预览窗格中 数据集是根据字符串参数从存储过程正确填充的 我可以在数据窗格中执行它 在预览窗格中运行报表时 会显示正确的行数 但单元格的内容不包含任何数据 源数据集基于
  • 执行计划中是否考虑了功能?

    当查询在 SELECT 或 WHERE 子句中包含 PL SQL 函数 用户定义函数 时 如何生成执行计划 它是否也计算这些函数的成本并将其显示在执行计划中 或者这些函数只是被忽略 在此先感谢您的帮助 用户生成的函数在 SELECT 或 W
  • SQL CASE 语句

    我有以下查询 我想将它们放入 sql CASE 语句中 这样我只有一个查询 但我不知道该怎么做 有人可以帮助我吗 IF SELECT EtlLoadId FROM ssislogs audit processcontrol WHERE Su
  • mssql 的 UUID 疯狂

    我的数据库条目有一个 UUID 及其值 使用 Microsoft SQL Server Management Studio 提取 CDF86F27 AFF4 2E47 BABB 2F46B079E98B 将其加载到我的 Scala 应用程序
  • 开发和生产 SQL Server 之间使用不同的排序规则会出现哪些问题?

    盘问 无法更新 sys columns 还有其他方法吗 https stackoverflow com questions 4018347 unable to update sys columns any other approach含糊地
  • SQL Server 2014执行计划创建需要很长时间(旧版本中很快)

    我在 SQL Server 2014 中遇到一个查询问题 第一次运行该查询时 需要很长时间才能生成执行计划 奇怪的是 它在 SQL Server 的所有早期版本 2012 2008 R2 2008 等 中都运行良好 它似乎与所涉及的表之一上
  • PDO 和 Microsoft SQL:必须声明表变量“@P1”

    我正在尝试使用 PDO 中的绑定从 Microsoft SQL 数据库中选择一些条目 我正在使用的代码看起来与我在文档中找到的代码类似 但是 当我运行它时 我收到以下警告 警告 PDOStatement execute pdostateme
  • SQL Server到Mysql迁移(使用Mysql Workbench)数据传输错误

    我正在使用 Mysql Work bench 6 3 将数据库从 MS Sql server 2008 迁移到 Mysql 在 批量数据传输 期间出错并出现以下警告 这种情况仅发生在像 varchar char 这样的列类型上 当我尝试使用
  • MySQL 多个 IN 条件对同一个表进行子查询

    我有多个带有子查询的 IN 条件 SELECT S name S email FROM something S WHERE 1 NOT IN SELECT id FROM tags WHERE somethingId S id AND 2
  • LINQ-to-SQL 是否支持组合查询?

    作为一名不懂 C 的程序员 我对 LINQ 查询的求值语义很好奇 如下所示 var people from p in Person where p age lt 18 select p var otherPeople from p in p
  • 使用存储过程访问数据可以提供哪些安全优势?

    我看到一些指南建议您通过存储过程对所有数据访问进行分层来保护数据库 我知道对于 SQL Server 您可以保护表甚至列免受 CRUD 操作的影响 例如 Logged in as sa USE AdventureWorks GRANT SE
  • 如何在 SQL Server 会话中设置自动提交?

    如何在 SQL Server 会话中设置自动提交 您可以通过将implicit transactions设置为OFF来打开自动提交 SET IMPLICIT TRANSACTIONS OFF 当设置为ON时 返回隐式事务模式 在隐式事务模式
  • 如何编辑表以启用级联删除?

    我有一个代表用户的表 当用户被删除时我得到 DELETE 语句与 REFERENCE 约束冲突 显然 CASCADE DELETE在SQL Server中并不像我想象的那么容易 需要将选项添加到表中 问题是 我不知道如何添加CASCADE
  • SQL限制数据库中的最小值和最大值

    CREATE TABLE TBL CD CDnr int identity 1 1 CDTitel nvarchar 80 NOT NULL CDduur int CDprijs smallmoney 所以我正在创建这个表 有什么方法可以将
  • 在带有循环引用的表中插入 SQL

    我有 2 张桌子 Empleados numEmpl nombre apellido sexo telefono salario numDept Departamentos numDept nombreDept numDirect 在部门中
  • 获取SQL中前2个特殊字符之间的字符

    我有数据在sql 只是要注意 SQL STudio is the IDE like data a 10 b c a 1 b c 我想获取前两个符号之间的数据 Output 10 1 这就是我的方法 SELECT CAST
  • 对时间序列数据重新采样

    我有一个以毫秒为单位的时间序列列表 我想对时间序列进行重新采样并对组应用平均值 我如何在 Postgres 中实现它 重新采样 是指聚合一秒或一分钟内的所有时间戳 一秒或一分钟内的所有行形成一组 表结构 date x y z Use dat
  • 计算行数并仅获取表中的最后一行

    我有一张桌子叫employeexam其结构和数据是这样的 id course id employee id degree date 1 1 3 8 2013 01 14 2 2 4 15 2013 01 14 3 2 4 17 2013 0
  • 批量更新 SQL Server C#

    我有一个 270k 行的数据库 带有主键mid和一个名为value 我有一个包含中值和值的文本文件 现在我想更新表格 以便将每个值分配给正确的中间值 我当前的方法是从 C 读取文本文件 并为我读取的每一行更新表中的一行 必须有更快的方法来做
  • Linq-to-entities,在一个查询中获取结果+行数

    我已经看到了有关此事的多个问题 但它们已经有 2 年 或更长 的历史了 所以我想知道这方面是否有任何变化 基本思想是填充网格视图并创建自定义分页 所以 我还需要结果和行数 在 SQL 中 这将类似于 SELECT COUNT id Id N

随机推荐