簡體   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