2017-12-22 11 views
0

날짜 필터링 누적 합계를 계산 나는 다음과 같은 값을 테이블에 사용자가 : PostgreSQL을

id |  created_at 
-------+--------------------- 
20127 | 2015-01-31 04:23:46 
21468 | 2015-02-04 07:50:34 
21571 | 2015-02-04 08:23:50 
20730 | 2015-03-12 10:20:16 
19955 | 2015-03-30 07:44:35 
20148 | 2015-04-17 13:03:26 
21552 | 2015-05-07 19:00:00 
20145 | 2015-06-02 03:12:46 
21467 | 2015-06-03 13:21:51 
21074 | 2015-07-03 19:00:00 

내가하고 싶은 :

  • 은 시간이 지남에 따라 사용자 수에 대한 누적 합계를 찾을 수 있습니다 (귀국일 수 데이터베이스에있는 날짜뿐만 아니라 날짜 범위의 매일 매일의 사용자 수를 표시합니다.
  • 날짜별로 해당 합계를 필터링 할 수 있어야합니다. 따라서 일부 행 뒤의 날짜를 입력하면 해당 행을 포함해야합니다 누적 합계 (범위 s 이전의 모든 것) 지정된 월이 첫 번째 합계에 포함되어야한다, 그것은 시대 형식으로 매일 그룹화
  • 반환 결과는

내가 이것을 달성하기 위해 노력하고있어 지정 범위)의 시작 부분에 0부터 계산을 시작하지 말아야

SELECT extract(epoch from created_at)::bigint, 
      sum(count(id)::integer) OVER (ORDER BY created_at) 
    FROM data_users 
    WHERE created_at IS NOT NULL 
    GROUP BY created_at 

누적 합계의 레코드를 제외하지 않고 여기 날짜별로 필터링을 추가 할 수 없으므로 예상대로 작동하지 않습니다. 또한 누락 된 날짜 (사용자가 존재하지 않는 날)도 고려하지 않습니다.

도움을 주시면 감사하겠습니다.

+0

하위 쿼리를 사용하고 필터링을 외부 쿼리에 넣기 만하면됩니다. –

+0

@ GordonLinoff 당신이 자세히 설명해 주시겠습니까? – shime

답변

1

최대한 멀리 GROUP BY 간단한 쿼리를 사용해야합니다 귀하의 질문을 이해합니다. 이 범위의 모든 날짜를 가져 오려면 GENERATE_SERIES()의 왼쪽 외부 조인을 사용할 수 있습니다. 당신이 범위의 시작과 끝 날짜가있는 경우, 당신은이를 사용할 수 있습니다

SELECT EXTRACT(EPOCH FROM d)::BIGINT, COALESCE(COUNT(u.id), 0) 
FROM GENERATE_SERIES(start, end, '1 DAY'::INTERVAL) d 
    LEFT OUTER JOIN data_users u ON u.created_at::DATE = d 
GROUP BY 1 ORDER BY 1 

당신도, 당신의 테이블에서 startend을 확인할 수 있습니다

SELECT EXTRACT(EPOCH FROM d.date)::BIGINT, COALESCE(COUNT(u.id), 0) 
FROM 
    (SELECT GENERATE_SERIES(MIN(created_at)::DATE, MAX(created_at)::DATE, '1 DAY'::INTERVAL) AS date 
    FROM data_users) d 
    LEFT OUTER JOIN data_users u ON u.created_at::DATE = d.date::DATE 
GROUP BY 1 ORDER BY 1; 

을이 반환

date_part | coalesce 
------------+---------- 
1422662400 |  1 
1422748800 |  0 
1422835200 |  0 
1422921600 |  0 
1423008000 |  2 
1423094400 |  0 
1423180800 |  0 
... 
1435536000 |  0 
1435622400 |  0 
1435708800 |  0 
1435795200 |  0 
1435881600 |  1 

이 쿼리를 사용하면 시작일 이전의 행에 대한 누적 합계를 얻을 수 있습니다.

SELECT EXTRACT(EPOCH FROM GREATEST(d.date, start))::BIGINT, COALESCE(COUNT(u.id), 0) 
FROM 
    (SELECT GENERATE_SERIES(MIN(created_at)::DATE, MAX(created_at)::DATE, '1 DAY'::INTERVAL) AS date 
    FROM data_users) d 
    LEFT OUTER JOIN data_users u ON u.created_at::DATE = d.date::DATE 
GROUP BY 1 ORDER BY 1; 
+0

두 번째 쿼리는'u.created_at :: DATE = d'에 대해'operator does not exist : date = record' 오류를 던집니다. 첫 번째 쿼리가 도움이됩니다. 감사합니다. – shime

+0

죄송합니다. 쿼리를 테스트 할 수 없습니다. 나는 그것을 고쳤고, 이제는 효과가있다. – clemens

+0

흠, 아직 내 검색어와이 날짜를 결합하는 방법을 모르겠다. 누적 합계가 필요하며 계산되지 않아야한다. – shime