在开始/结束日期将记录拆分为多个记录

2024-02-22

我正在寻找一种解决方案,必须使用另一个表中的数据从一个记录创建一组记录。表定义:

DECLARE A AS TABLE
(
 AID BIGINT NOT NULL,
 StartDate DATETIME NOT NULL,
 EndDate DATETIME
)

DECLARE B AS TABLE
(
 AID BIGINT NOT NULL,
 StartDate DATETIME NOT NULL,
 EndDate DATETIME NULL
)

这个想法是,当 A 包含:

1 | 01-01-2010 | 01-02-2010
2 | 01-10-2010 | 31-10-2010

B 包含:

1 | 01-01-2010 | 15-01-2010
2 | 15-10-2010 | 20-10-2010

我们收到 5 条记录:

1 | 01-01-2010 | 15-01-2010
1 | 16-01-2010 | 01-02-2010
2 | 01-10-2010 | 15-10-2010
2 | 16-10-2010 | 20-10-2010
2 | 21-10-2010 | 31-10-2010

目前,我们使用 A 上的游标和 B 上的内循环游标来执行此操作,我们必须在 SQLServer(TSQL 或最坏情况下的 CLR)中执行此操作

关于如何将其写为选择以使光标的开销消失的任何想法?


DECLARE @A TABLE (AID BIGINT NOT NULL, StartDate DATETIME NOT NULL, EndDate DATETIME)
DECLARE @B TABLE (AID BIGINT NOT NULL, StartDate DATETIME NOT NULL, EndDate DATETIME NULL)

SET DATEFORMAT dmy
INSERT @A VALUES (1 ,'01-01-2010','01-02-2010')
INSERT @A VALUES (2 ,'01-10-2010','31-10-2010')
INSERT @B VALUES (1 ,'01-01-2010','15-01-2010')
INSERT @B VALUES (2 ,'15-10-2010','20-10-2010')

;WITH transitions as
(
    SELECT *, ROW_NUMBER() OVER (PARTITION BY AID ORDER BY startdate) Sequence
    FROM (
        SELECT A.AID, A.startdate
        FROM @a A
        UNION
        SELECT A.AID, B.startdate + 1
        FROM @A A
        INNER JOIN @b B ON B.startdate > A.startdate AND B.startdate < A.enddate
        UNION
        SELECT A.AID, B.enddate + 1
        FROM @A A
        INNER JOIN @b B ON B.enddate > A.startdate AND B.enddate < A.enddate
        UNION
        SELECT A.AID, A.enddate + 1
        FROM @a A
        WHERE A.enddate > A.startdate
    ) T
)   
SELECT T1.AID, T1.startdate startdate, T2.startdate - 1 enddate
FROM transitions T1
INNER JOIN transitions T2 ON T2.AID = T1.AID AND T2.Sequence = T1.Sequence + 1
ORDER BY T1.AID, T1.Sequence
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在开始/结束日期将记录拆分为多个记录 的相关文章

随机推荐

  • ListView 中每个项目的单独首选项?

    我正在创建我的第一个 Android 应用程序 或者无论如何都在尝试 但我有一个问题 我似乎找不到答案 我想允许用户为列表视图中的每个项目输入一组单独的首选项 我的 PreferenceScreen 正在工作 但它为每个项目维护相同的首选项
  • 为什么 scanf 中需要 %hd ?

    我创建了一个非常简单的程序 带有菜单 取一个值 然后将其记忆到 局部变量值 最后与 第二个选项是程序打印该值 我的问题是 为什么只有添加 h 程序才能运行 到 scanf 参数 换句话说 存在什么样的关系 scanf 和我的本地 int 值
  • Sprite Kit:大量带有 Bit Blitting 的 sprite(1000+)

    我正在尝试使用 SpriteKit 创建一个场景 其中包含数千个精灵 500 2000 每个精灵只是一个 1x1 的白色像素 甚至不需要为它们使用纹理 立即将这么多精灵直接添加到场景中是不可能的 或者至少我这么认为 在 iPhone 6 上
  • 玩法框架2:在route中使用Array[String]

    我想生成一个像这样的网址 照片 标签 标签1 标签2 标签3 路线文件 GET photo controllers Photos list tags Array String 我在播放控制台中收到此错误 找不到 Array String 类
  • 尝试使用 ServiceController 时出现错误 MSB4062

    我在 x64 计算机上使用 Visual Studio 2010 和 TFS 2010 我正在尝试在我的构建中使用 MSBuild 社区任务目标 该目标存在于源代码管理中 因此 在我的 csproj 文件中 我导入该特定目标 但现在出现以下
  • 在项目的层次结构中找不到新元素

    我正在尝试为 Xamarin 应用程序创建一个简单的页面 但完全无法继续执行最基本的步骤 我从项目存储库中检查分支 并尝试添加新文件 当我这样做时 右键单击文件夹 添加 gt 新项目 gt 内容页面 我收到此错误 它实际上创建了 xaml
  • 在使用像数组这样的变量之前分配 array()

    我试图找到一个合适的解释性标题 但我找不到 我将尝试解释我在这里问的问题 通常 如果您不将空数组分配给变量 则可以开始为索引分配值 如下所示 hello world Hello World echo hello world 但我总是遇到这样
  • 从工作线程使用 Flask SQLAlchemy

    我有一个 python 应用程序使用烧瓶宁静 http flask restful cn readthedocs io en 0 3 5也Flask SQLAlchemy http flask sqlalchemy pocoo org 2
  • Bootstrap 中缺少可见-** 和隐藏-**

    在Bootstrap v3中我经常使用hidden 类结合clearfix来控制不同屏幕宽度下的多列布局 例如 我可以在一个 DIV 中组合多个 hide 以使我的多列在不同的屏幕宽度下正确显示 举个例子 如果我想显示多行产品照片 在较大的
  • Common Lisp:如何使用条件拼接在宏中构建列表?

    我们假设 defmacro testing optional var list this is when consp var a list 当被调用时 gt testing 2 THIS IS gt testing list 1 2 THI
  • 从 asp.net/C# 查询 MUMPS

    有谁知道如何使用 C 从 MUMPS 数据库查询而不使用 KBSQL ODBC 我们需要从 MUMPS 数据库 Mckesson STAR Patient care 进行查询 当我们使用 KBSQL 时 它仅限于 6 个并发用户 因此我们尝
  • 如何回收/重用 CUDA 线程

    在 CUDA 中 如何为内核中的所有线程创建一个等待的屏障 直到CPU向该障碍发送一个信号 表明继续进行是安全的 有帮助的 我想避免启动 CUDA 内核的开销 有两种类型的开销需要避免 1 在 X 块和 Y 线程上简单启动内核的成本 以及
  • 如何在角度4中以动态形式设置ngIf动态条件

    我正在创建一个动态表单 在其中根据 JSON 的响应动态填充字段 Eg type text required true minlength 3 maxlength 5 name fname visibility true type text
  • 有没有办法使用 HashWithIn DifferentAccess 序列化 ActiveRecord 的 JSON 属性?

    我在用ActiveRecord ConnectionAdapters PostgreSQLAdapter在 Rails 应用程序中 假设我有一个架构 create table foo id bigserial force cascade d
  • 如果未发送,请重试发送邮件

    我正在使用 nodemailer 通过我的节点应用程序发送电子邮件 有时电子邮件不起作用并抛出错误 直到我尝试两次或三次 我希望我的程序一次又一次地尝试 直到邮件成功发送 这是我的代码 const mailOptions from from
  • Django 锁定身份验证 - 登录表单不起作用

    我一直在研究锁定整个页面的方法 一位同事引起了我的注意Django 锁定 https bitbucket org carljm django lockdown src 我已经安装了 我的代码如下所示 INSTALLED APPS lockd
  • jQuery 如何获取元素的边距和填充?

    只是想知道 如何使用 jQuery 我可以获得格式化的总填充和边距等元素 即 30px 30px 30px 30px 或 30px 5px 15px 30px 等 I tried var margT jQuery img css margi
  • StreamingFileSink 未将数据提取到 s3

    我创建了简单的摄取服务 该服务选择本地文件并使用 StreamingFileSink 摄取到 s3 https ci apache org projects flink flink docs stable dev connectors st
  • Java 的快速超越/三角函数

    由于 java lang Math 中的三角函数非常慢 是否有一个库可以快速且良好地近似 似乎可以在不损失太多精度的情况下以数倍的速度进行计算 在我的机器上 乘法需要 1 5ns 而 java lang Math sin 需要 46ns 到
  • 在开始/结束日期将记录拆分为多个记录

    我正在寻找一种解决方案 必须使用另一个表中的数据从一个记录创建一组记录 表定义 DECLARE A AS TABLE AID BIGINT NOT NULL StartDate DATETIME NOT NULL EndDate DATET