sql-server - 仅当 Datediff 到另一个值足够高时才插入值
问题描述
所以我有一个带有值的表(1)
- 引导编号
- 开机日期
还有一张桌子 (2)
引导ID
引导编号
现在我想对其从表 1 到表 2 运行插入查询,将所有 Boots 插入表(2),困难的是字段值BootNumber
可能会更频繁地出现,例如 BootNumber12345
可能出现在 2015 年和 2019 年。
新的数据模型通过 BootID(2) 区分这些记录,但我无法得到一个查询,如果它们之间有 12 个月和表 (2) 中该引导号的最后一条记录,则只导入 Boots。
BootNumbers with more than 12 months difference in Date should be a new record in Table (2)
解决方案
您可以使用Analytic Functions获取要插入的记录列表。该LAG
函数是一个窗口函数。OVER
您可以使用子句创建分区。创建一个按 BootNumber 分区的窗口可以为您提供一个排序的值列表。这是您的表格的示例:
DECLARE @Table1 TABLE
(
BootNumber INT,
BootDate DATE
)
INSERT INTO @Table1 VALUES(12345, '20150101')
INSERT INTO @Table1 VALUES(12345, '20150601')
INSERT INTO @Table1 VALUES(12345, '20190101')
;WITH CTE
AS
(
SELECT *,
Diff = DATEDIFF(MONTH, LAG(BootDate) OVER (PARTITION BY BootNumber ORDER BY BootDate), BootDate),
PrevDate = LAG(BootDate) OVER (PARTITION BY BootNumber ORDER BY BootDate) --for debug only
FROM @Table1
)
SELECT * FROM CTE WHERE Diff >= 12
因为您使用链接服务器,所以您应该在 SQL Server 上创建一个过程并使用该过程的参数在您的选择中进行筛选。该过程可以为您返回一个类似于 from CTE 的表。使用此数据在 Access 中插入。
推荐阅读
- sorting - 如何对带有数字的字符串进行数字排序?
- python-3.x - ImportError:无法从“allennlp.data.dataset_readers.dataset_utils”导入名称“Ontonotes”
- flutter - 如何在 Flutter 中的 ListView 元素上设置 onTab
- r - 更改 ggplot 中的 y 轴文本
- javascript - 如何更改 vue.js 中数组内数据的状态?
- printf - 系统启动前的 printf
- convolution - 为什么消除密集层会提高 DCGAN 的性能?
- unity3d - 当我在抓墙时停止所有移动时,Unity角色控制器角色没有冻结(他一直在滑动)
- python - Flask:如何将 SQLite 中的表显示到 Flask 上?
- python - AIRFLOW : 自定义 SFTPOperator 以下载多个文件