복붙노트

[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. ==============================

    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. ==============================

    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]);
    

    또한, 날짜는 국제 형식입니다. 당신이 그와 함께 문제가 발생할 경우, 앨런 브라운 국제 날짜를 검토

  3. 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