首页 > 解决方案 > 仅当 Datediff 到另一个值足够高时才插入值

问题描述

所以我有一个带有值的表(1)

还有一张桌子 (2)


现在我想对其从表 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)

标签: sql-serverms-access

解决方案


您可以使用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 中插入。


推荐阅读