2013-08-02 4 views
1

자기 조인을 사용하여 두 개의 연속 행 (이 경우 카운터)의 차이점을 찾으려고합니다. 테이블 이름은 counter_table이고 기본 키는 Country + State + City + dateandtime입니다. dateandtime은 시간 소인 필드이며 약 30 분마다 데이터가 삽입되지만 해당 간격 동안 데이터가 전혀 삽입되지 않은 경우가 있습니다. 즉 다음 데이터 세트가 1 시간 후에 도착하거나 몇 시간 후에 더 악화되는 경우를 의미합니다. 달라질 수 있습니다. 결과 세트가자기 조인은 Postgres의 연속적인 행 사이의 차이를 찾기 위해 자체 조인을 시도했지만 작동하지 않는 것 같습니다.

 
Country   State City Dateandtime A Dateandtime B counter_1A Counter_1B 1B-1A Counter_2A Counter_2B 2B-2A 
United States Texas Austin 7/17/2013 22:00 7/17/2013 22:30 1814166 1814291 125 1762331 1762454 123 
United States Texas Austin 7/17/2013 22:30 7/17/2013 23:00 1814291 1814389 98 1762454 1762548 94 
United States Texas Austin 7/17/2013 23:00 7/17/2013 23:30 1814389 1814489 100 1762548 1762640 92 
United States Texas Austin 7/18/2013 0:30 7/18/2013 1:00 1814647 1814708 61 1762795 1762855 60 
United States Texas Austin 7/18/2013 1:00 7/18/2013 1:30 1814708 1814758 50 1762855 1762905 50 
United States Texas Austin 7/18/2013 1:30 7/18/2013 2:00 1814758 1814829 71 1762905 1762975 70 
United States Texas Austin 7/18/2013 2:00 7/18/2013 2:30 1814829 1814892 63 1762975 1763037 62 
United States Texas Austin 7/18/2013 2:30 7/18/2013 3:00 1814892 1814977 85 1763037 1763122 85 
United States Texas Austin 7/18/2013 3:00 7/18/2013 3:30 1814977 1815056 79 1763122 1763200 78 
United States Texas Austin 7/18/2013 3:30 7/18/2013 4:00 1815056 1815105 49 1763200 1763249 49 

이 obvously 최적의 솔루션, 23시 반 및 00의 기록되지 다음과 같다

SELECT A.country, A.state, A.city, A.dateandtime, B.dateandtime, A.counter_1, B.counter_1, (B.counter_1 - A.counter_1), A.counter_2, B.counter_2, (B.counter_2 - A.counter_2) 
FROM counter_table A, counter_table B 
WHERE A.country = B.country 
AND A.state = B.state 
AND A.city = B.city 
AND A.dateandtime > '2013-07-17 22:00:00' 
AND B.dateandtime >= (A.dateandtime + interval '29 minutes') 
AND B.dateandtime <= (A.dateandtime + interval '33 minutes') 
ORDER BY 1,2,3,4; 

아래로

내가 지금 사용하는 쿼리는 다음과 같습니다 00이 누락되었습니다. 일부 Postgres 전문가가 도움을 줄 수 있습니까? 창 함수는이 문제에 대한 좋은 해결책입니까?

답변

1

여기서는 윈도우 기능을 사용하는 것이 좋습니다. 또한 23:30과 00:00이 누락 된 이유를 사람들이 이해할 수 있도록 원래 세트의 예제를 제공해야합니다.

+0

가 나는 해결책을 가지고 생각, 이것은 도시를 선택 '지연'창 기능을 사용하여 아래의 쿼리 (dateAndTime의) OVER (도시 BY ORDER, dateAndTime의) prev_dateandtime로, \t dateAndTime의, 지연 지연 (counter_1을 작동하는 것 같군 (도시, 날짜 및 시간별로 주문) AS prev_counter, \t counter_1, counter_1 - 지연 (counter_1) 이상 (도시, 날짜 및 시간 순서) AS diff_counter FROM counter_table 1,3; – Biju

+2

@ 비쥬 (Biju) : 자신 만의 질문에 대답 할 수 있습니다. 의견을 남기는 것보다 자신의 대답이 더 나을 것입니다. –