인터리빙 행 사이의 동일한 열에서 날짜 범위의 차이점을 가장 잘 요약하는 방법은 무엇입니까? Datetime 열이 있고 행의 차이를 계산하려고합니다. 초의 차이를 원합니다. 이 질문은 두 타임 스탬프 간의 차이를 얻는 방법에 대한 것이 아니라 같은 테이블의 행 간을 가장 효율적으로 계산하는 방법에 중점을 둡니다. 필자의 경우 각 행에는 2 개의 행을 논리적으로 연결하는 datetime eventype이 있습니다.
세부 사항 시작 및 종료의 이벤트 유형을 그룹화하는 방법과 관련이 있습니다. (앤드리 M의 질문) 시작과 끝은 "연속해야한다". 시작에 후속 종료가 없으면 합계에서 제외되어야합니다. 다음 시작으로 이동하여 끝이 있는지 확인하십시오. 총 초 합계에 연속적인 시작-끝 쌍만 추가해야합니다.
postgresql 9.x에서 작업 중 ...
테이블의 예제 데이터;
eventtype, eventdate
START, 2015-01-01 14:00
END, 2015-01-01 14:25
START, 2015-01-01 14:30
END, 2015-01-01 14:43
START, 2015-01-01 14:45
END, 2015-01-01 14:49
START, 2015-01-01 14:52
END, 2015-01-01 14:55
모든 시작 날짜와 종료 날짜는 순차적입니다.
여기 내 첫 시도가 있습니다. 작동하는 것 같습니다.
SELECT
-- starts.*
SUM(EXTRACT(EPOCH FROM (eventdate_next - eventdate))) AS duration_seconds
FROM
(
WITH x AS (
SELECT *, dense_rank() OVER (ORDER BY eventdate) AS rnk
FROM table
AND eventdate > '2015-01-01 00:00:00.00'
AND eventdate < '2016-01-01 23:59:59.59'
)
SELECT x.eventdate, x.eventtype, y.eventdate AS eventdate_next, y.eventtype AS eventtype_next
FROM x
LEFT JOIN (SELECT DISTINCT eventdate, eventtype, rnk FROM x) y ON y.rnk = (x.rnk + 1)
ORDER BY x.eventdate
) starts
WHERE
eventtype = 'START'
GROUP BY eventtype
내 첫 번째 시도는 stackoverflow Postgres 9.1-다음 값 얻기의 훌륭한 예를 기반으로 합니다.
노트; GROUP BY 및 SUM에 주석을 달고 시작을 주석 해제하십시오. * 각 지속 시간에 대한 레코드를 합산으로 가져옵니다.