繁体   English   中英

查询从同一表中的另一条记录获取值并按大于间隙阈值的差异进行过滤

[英]Query for getting value from another record in same table and filter by difference greater than a gap threshold

我将数据导入到 MSAccess 中的临时表中,如下所示:

临时表

我添加了我需要使用 SQL 查询计算的“差距”和“上一个/当前”列。 “差距阈值”是用户输入或提供给查询的参数,例如为 300。GlobalID 对 ItemID 进行分组,而每个 ItemID 都是唯一编号。

我想要做的是计算 GAP

(GAP = TEMPORARY_1![版本日期] - 临时![版本日期])

在相似 GlobalID 的 ItemID 之间,并识别具有 GAP > GAP THRESHOLD 值的项目。 基于此 GAP,对于每个 GlobalID 分组的 ItemID,我想确定哪个是“上一个”ItemID,哪个是“当前”ItemID。

即确定哪个是上一个项目,哪个是当前项目,它们之间的差距超过 300 天。

最后,创建另一个表,它只会为每个 GlobalID 导入这些 Current/Previous Pairs,但将它们显示为一个记录,如下所示:

决赛桌

或者在计算 GAP > GAP THRESHOLD 之后创建 2 个单独的表,从临时表中称为tblPrevioustblCurrent是不是更好的设计?:

tbl上一个

tblCurrent

我需要有人为我指出正确的方向,以进行更好的规范化设计并使用 SQL 查询实现这一点。 注意:每次都需要根据导入的新数据提取动态生成所有表。

下面的查询在 Gap 列上给出错误并且不计算上一个/当前:

PARAMETERS Threshold Long;
SELECT TEMPORARY.GlobalID, TEMPORARY.ItemID, TEMPORARY.[Version Date], IIf([TEMPORARY]![GlobalID]=
[TEMPORARY_1]![GlobalID],Max([TEMPORARY]![Version Date])-Min([TEMPORARY_1]![Version Date])=0,"Previous") AS Previous, TEMPORARY_1.ItemID, TEMPORARY_1.[Version Date], IIf([TEMPORARY]![GlobalID]=[TEMPORARY_1]![GlobalID],Max([TEMPORARY]![Version Date])-Min([TEMPORARY_1]![Version Date])>[Threshold],"Current") AS [Current], IIf(([TEMPORARY]![Version Date]-[TEMPORARY_1]![Version Date])>[Threshold],[TEMPORARY]![Version Date]-[TEMPORARY_1]![Version Date],"") AS GAP
FROM TEMPORARY, TEMPORARY AS TEMPORARY_1
GROUP BY TEMPORARY.GlobalID, TEMPORARY.ItemID, TEMPORARY.[Version Date], TEMPORARY_1.GlobalID, TEMPORARY_1.ItemID, TEMPORARY_1.[Version Date];

非常感激任何的帮助。

查看Allen Browne 子查询

叙述中描述的要求与标题不同。 以下是对两者的建议。

查询拉取当前/以前的货币对。

查询 1:

SELECT [GlobalID], [ItemID] AS CurItemID, [Version Date] AS CurDate, (SELECT TOP 1 [Version Date] FROM Temporary AS Dupe WHERE Dupe.GlobalID=Temporary.GlobalID AND Dupe.ItemID < Temporary.ItemID ORDER BY Dupe。 GlobalID, Dupe.ItemID DESC) AS PreDate, (SELECT TOP 1 [ItemID] FROM Temporary AS Dupe WHERE Dupe.GlobalID=Temporary.GlobalID AND Dupe.ItemID < Temporary.ItemID ORDER BY Dupe.GlobalID, Dupe.ItemID DESC) AS PreItemID FROM [临时];

查询 2:

SELECT Query1.GlobalID, Query1.CurItemID, Query1.CurDate, Query1.PreDate, Query1.PreItemID, DateDiff("d",[PreDate],[CurDate]) AS Gap FROM Query1 WHERE ((([GlobalID] & [CurItemID] ) 在 (SELECT TOP 1 GlobalID & CurItemID FROM Query1 AS Dupe WHERE Dupe.GlobalID = Query1.GlobalID ORDER BY GlobalID, CurItemID DESC))) AND DateDiff("d",[PreDate],[CurDate]) > Int([Enter]临界点]);

最终输出:

GlobalID CurItemID CurDate PreDate PreItemID Gap
00109086 2755630 2/26/2015 3/11/2014 2130881 352
00114899 2785590 3/13/2015 3/25/2014 2093191 353
00154635 2755623 2/26/2015 4/4/2014 2176453 328

这是解决标题中所述的最小值/最大值要求的查询。 不像当前/以前的查询那么慢,但如果数据集变得更大,我预计它会变得非常慢。

SELECT Maximum.GlobalID, Maximum.ItemID AS MaxItem, Maximum.[Version Date] AS MaxItemDate, Minimum.ItemID AS MinItem, Minimum.[Version Date] AS MinItemDate, Maximum.[Version Date]-Minimum.[Version Date] AS Gap
FROM 
(SELECT T1.GlobalID, T1.ItemID, T1.[Version Date] FROM [Temporary] AS T1 WHERE (((T1.ItemID) In (SELECT Min([ItemID]) AS MinItem FROM Temporary GROUP BY GlobalID)))) AS Minimum 
INNER JOIN 
(SELECT T1.GlobalID, T1.ItemID, T1.[Version Date] FROM [Temporary] AS T1 WHERE (((T1.ItemID) In (SELECT Max([ItemID]) AS MaxItem FROM Temporary GROUP BY GlobalID)))) AS Maximum 
ON Minimum.GlobalID = Maximum.GlobalID
WHERE Maximum.[Version Date]-Minimum.[Version Date]>Int([Enter Threshold]);

此外,您的日期采用国际格式。 如果您遇到问题,请查看Allen Browne International Dates

将提供更多贡献 - 带有 VBA 代码的选项以获取当前/以前的对。 这确实需要将记录保存到表中。 测试并快速运行。

Sub GetGap()
Dim intTH As Integer, x As Integer, strGID As String
Dim rsT1 As DAO.Recordset, rsT2 As DAO.Recordset
CurrentDb.Execute "DELETE FROM Temp"
Set rsT1 = CurrentDb.OpenRecordset("SELECT * FROM Temporary ORDER BY GlobalID, ItemID DESC;")
Set rsT2 = CurrentDb.OpenRecordset("SELECT * FROM Temp;")
strGID = rsT1!GlobalID
x = 1
While Not rsT1.EOF
    If strGID = rsT1!GlobalID Then
        If x = 1 Then
            rsT2.AddNew
            rsT2!GlobalID = strGID
            rsT2!CurItemID = rsT1!ItemID
            rsT2!CurDate = rsT1![Version Date]
            x = 2
        ElseIf x = 2 Then
            rsT2!GlobalID = strGID
            rsT2!PreItemID = rsT1!ItemID
            rsT2!PreDate = rsT1![Version Date]
            x = 3
        End If
        If Not rsT1.EOF Then rsT1.MoveNext
    Else
        If x = 3 Then rsT2.Update
        strGID = rsT1!GlobalID
        x = 1
    End If
    If rsT1.EOF Then rsT2.Update
Wend
End Sub

然后一个查询可以很容易地计算 Gap 和过滤记录。

SELECT Temp.GlobalID, Temp.CurItemID, Temp.CurDate, Temp.PreDate, Temp.PreItemID, [CurDate]-[PreDate] AS Gap FROM Temp WHERE ((([CurDate]-[PreDate])>Int([Enter Threshold ])));

或者可以将代码扩展为也计算 Gap 并仅保存满足阈值要求的记录,只是稍微复杂一些。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM