在购买记录中,我想生成一个基准日期+/-12个月的序列
Client Date
Joe 2020-03-15
Maria 2019-11-01
所以预期的结果是
Client Date
Joe 2019-03-15
Joe 2019-04-15
.
.
.
Joe 2020-03-15
.
.
.
Joe 2021-02-15
Joe 2021-03-15
Maria 2018-11-01
Maria 2018-12-01
.
.
.
Maria 2019-11-01
.
.
.
Maria 2020-10-01
Maria 2020-11-01
如何做到这一点?
3条答案
按热度按时间hwamh0ep1#
一个选项使用递归查询:
lyr7nygr2#
另一个选择是一个特别的理货表与
CROSS JOIN
例子退货
编辑:如果你想+/-12个月,只是一个小的调整是必需的
vs91vp4v3#
这里有一个稍微不同的解决方案,它使用了计数表的本质。我之所以发布它,是因为很多人的dba不允许他们使用主数据库中的东西,还因为需要一系列的值是一件非常常见的事情。下面的方法还导致在序列的生成中没有逻辑读取。
也就是说,“理货表”经常被称为t-sql的“瑞士军刀”。十年前,erlandsommarskog通过ms“connect”(feedback的旧名称)请求一个内置的序列生成器,这一点非常重要。不幸的是,十多年来,她除了保留请求外,什么也没做。
考虑到这一点,下面是我对伊兹克·本·甘(itzik ben gan)创造这种功能的优秀作品的演绎。它非常有意地只能从“0”或“1”开始,但可以上升到(实际上超过)您可能需要的任何正int值。如果您需要它从一个不同于“0”或“1”的数字开始,那么在函数之外的一个简单的整数数学就可以实现它。我之所以没有将该功能构建到函数中,是因为从“0”或“1”开始的序列是最常见的用法,我不想因为这个函数所经历的极端用法而对性能造成一到两毫秒的影响。
这是函数。。。每个人都应该在每个数据库中或者在普通公众可以使用的“实用程序”数据库中都有类似的东西。
p、 我通常不使用“匈牙利符号”的对象,但我也有一个理货表,你不能有两个同名的对象。
一旦你有了这样的东西,需要数字序列的问题就变得简单、快速、廉价。例如,下面是如何使用此函数编写op问题的解决方案。
如果您想测试代码,下面是我为测试表构建的内容。
如果你想知道更多关于“理货表”和相关函数的工作原理,这里有一个链接到我的文章,这篇文章太长了,不能在这里发表。
“数字”或“计数”表:它是什么以及它如何替换循环