주어진 타임 스탬프와 타임 스탬프의 집계 값을 가져 오는 쿼리를 만드는 데 어려움이 있습니다. 주어진 다음의 스키마는 :데이터에 따라 오늘과 전날의 집계
인해 데이터 격차에ts
열에서 차이가있다
name TEXT,
ts TIMESTAMP,
X NUMERIC,
Y NUMERIC
, 나는 첫 번째 절반은 간단
name,
date_trunc('day' q1.ts),
avg(q1.X),
sum(q2.Y),
date_trunc('day', q2.ts),
avg(q2.X),
sum(q2.Y)
생산하는 쿼리를 구축하기 위해 노력하고있어 :
를SELECT q1.name, date_trunc('day', q1.ts), avg(q1.X), sum(q1.Y)
FROM data as q1
GROUP BY 1, 2
ORDER BY 1, 2;
그러나 관계를 생성하여 각 행에 대해 이전에 "일"을 찾는 방법을 모르십니까? 나는 내부는 다음과 같이 가입 해결하려고 노력 해요 :
SELECT q1.name, q1.day, q1.avg, q1.sum, q2.day, q2.avg, q2.sum
FROM (
SELECT name, date_trunc('day', ts) AS day, avg(X) AS avg, sum(Y) as sum
FROM data
GROUP BY 1,2
ORDER BY 1,2
) q1 INNER JOIN (
SELECT name, date_trunc('day', ts) AS day, avg(X) AS avg, sum(Y) as sum
FROM data
GROUP BY 1,2
ORDER BY 1,2
) q2 ON (
q1.name = q2.name
AND q2.day = q1.day - interval '1 day'
);
다음 "날"현재 전날보다 1 일입니다 때, 그것은 경우에는 적용되지 않습니다되는이의 문제.
나는 이것이 아름답다는 것을 결정할 수 없다. 아니면 그냥 검은 마법이다. 그것은 완벽하게 작동합니다. 이해한다면 ... CTE를 사용하여 합계 행을 적절히 수집 한 다음 두 번째 및 세 번째 선택을 사용하여 필요한 CTE 내의 행을 가리키는 것입니다. 맞습니까? 감사! – Justin
CTE는 로컬 임시 테이블과 같은 역할을합니다. 그래서, 네, 그게 맞을 것입니다 - 제 3 선택이 없다는 것을 제외하고는, 왼쪽 결합과 함께 단지 두번째. –
. 그리고 'FROM q q1'은 CTE q를 q1로, 'LEFT JOIN q q1'을 CTE q에서 q2로, 맞습니까? 그 유형의 구문에 대한 이름이 있습니까? (즉, [구문 설명서] (http://www.postgresql.org/docs/8.1/static/sql-select.html)에서이 코드 유형을 찾거나 참조 할 수있는 곳을 찾지 못했습니다. – Justin