[SQL] 갭 임계 값보다 차이가 큰 테이블과 동일한 필터의 다른 레코드로부터 값을 취득하기위한 쿼리
SQL갭 임계 값보다 차이가 큰 테이블과 동일한 필터의 다른 레코드로부터 값을 취득하기위한 쿼리
I는 다음과 같습니다 MS Access에서 임시 테이블에 가져온 데이터를 가지고 :
어떤에 나는 내가 SQL 쿼리를 사용하여 계산해야하는 "갑"과 "이전 / 현재"열을 추가했습니다. 은 "갭 임계 값"쿼리와 예에 제공된 사용자 입력 또는 매개 변수입니다 각 항목 ID는 고유 번호 인 반면 300 GlobalID 그룹은의를 항목 ID된다.
내가 뭘 원하는 간격을 계산이다
항목 ID의 유사한 GlobalID의의 및 GAP> GAP 임계 값을 갖는 항목을 식별 사이. 각 항목 ID의 GlobalID 그룹화이 GAP, 바탕으로, 나는 "이전"항목 ID이며, 이는 "현재"항목 ID인지를 결정하고자합니다.
마지막으로, 각 GlobalID에 대해이 현재 / 이전 쌍을 가져옵니다 다른 테이블을 만들 수 있지만 하나 개의 기록으로이 같은 각을 표시 :
아니면이 같은 임시 테이블에서 tblPrevious 및 tblCurrent라고 GAP> GAP 한계를 계산 한 후이 개 별도의 테이블을 만드는 더 나은 디자인인가?
나는 더 나은 표준화 된 디자인을 가지고이 사용하는 SQL 쿼리를 달성하기 위해 올바른 방향으로 날 가리 키도록 사람이 필요합니다. 참고 : 모든 테이블이 가져온 새로운 데이터 추출을 기반으로 때마다 동적으로 생성 될 필요가있다.
쿼리 아래는 갭 열에 오류를 제공 및 이전 / 현재 계산하지 않습니다
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.현재 / 이전 쌍을 얻기 위해 옵션 VBA 코드 - 또 하나 명의 기여를 제공 할 것입니다. 이 테이블에 레코드를 저장 요구 않습니다. 스냅에서 테스트 및 실행됩니다.
현재 / 이전 쌍을 얻기 위해 옵션 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
그런 다음 쿼리는 쉽게 간격 및 필터 기록을 계산할 수 있습니다.
또는 코드는 갭 CALC 및 임계 값 요구 사항, 조금 더 복잡을 충족하는 레코드 만 저장도 확장 될 수있다.
-
==============================
2.검토 앨런 브라운 하위 쿼리.
검토 앨런 브라운 하위 쿼리.
이야기에 설명 된 요구 사항은 제목에서 차이가있다. 여기 모두를위한 제안입니다.
현재 / 이전 쌍을 당겨 조회합니다.
쿼리 1 :
질의 2 :
최종 출력 :
다음 쿼리는 그 주소를 제목에 명시된 최소 / 최대에 대한 요구 사항. 현재 / 이전 쿼리하지만 경우 느린하지 데이터 세트 내가 그것을 매우 느리게 얻을 것으로 기대 상당히 큰 얻을 수 있습니다.
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]);
또한, 날짜는 국제 형식입니다. 당신이 그와 함께 문제가 발생할 경우, 앨런 브라운 국제 날짜를 검토
from https://stackoverflow.com/questions/42903785/query-for-getting-value-from-another-record-in-same-table-and-filter-by-differen by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 대신 필터 테이블의 C # 목록을 기반으로 필터 SQL (0) | 2020.05.17 |
---|---|
[SQL] 연결하여 그룹화 행 (0) | 2020.05.17 |
[SQL] SQL0418N 오류 해결 방법 (0) | 2020.05.16 |
[SQL] 동적 파일 이름으로 복사 (0) | 2020.05.16 |
[SQL] SQL 함수 - 계승 (0) | 2020.05.16 |