![](/img/trans.png)
[英]Query for width and height, a record with each greater than the other in the same query?
[英]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 個單獨的表,從臨時表中稱為tblPrevious和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];
非常感激任何的幫助。
敘述中描述的要求與標題不同。 以下是對兩者的建議。
查詢拉取當前/以前的貨幣對。
查詢 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.