2013-10-21 4 views
0

통계 모듈을 생성하는 중입니다. 내 일 중 하나는 지난 주 동안 등록 된 사용자의 합계로 플롯을 만드는 것입니다.
문제는 내가 소수의 고객 만 사용하고있는 서비스에 종사하고 있으므로 아무런 등록이 자주 발생하지 않는 날입니다.GROUP BY SELECT를 수행하는 동안 0 값 선택

표 설명 (간체)입니다 :

TABLE users: 
============ 
id serial NOT NULL, 
date_created timestamp with timezone NOT NULL DEFAULT NOW() 

은 지난 7 일 동안 합계를 얻기 위해, 내가 포스트 그레스 예를 들어 반환

SELECT 
    COUNT(id) as ile, 
    DATE_TRUNC('day', date_created) as day 
FROM 
    users 
WHERE 
    date_created >= now() - INTERVAL '7 days' 
GROUP BY 2 
ORDER BY 2 

모든 것이 잘 작동 사용

ile | day 
=========================== 
2 | "2013-09-23 00:00:00" 
1 | "2013-09-25 00:00:00" 

0 카운트가 아닌 날을 제외합니다. 물론이 쿼리의 결과 (이 경우에는 PHP + Symfony)를 파싱해야하므로 원하는 날짜 범위를 반복하고 빈칸을 채울 수 있습니다. 간단한 방법으로 PostgreSQL에 요청하는 방법이 궁금합니다. 나 때문에 이런 식으로 뭔가를 반환

ile | day 
=========================== 
2 | "2013-09-23 00:00:00" 
0 | "2013-09-24 00:00:00" 
1 | "2013-09-25 00:00:00" 
0 | "2013-09-26 00:00:00" 
0 | "2013-09-27 00:00:00" 
0 | "2013-09-28 00:00:00" 
0 | "2013-09-29 00:00:00" 

답변

1

순간에 테스트 할 수 없습니다,하지만 당신은 generate_series() 기능을 사용할 수 있습니다 : 내가 함께 참여 수행 할 수있는 인식하지 않았다, 솔직히

select 
    count(u.id) as ile, 
    d.day 
from generate_series('2013-09-23'::date, '2013-09-29'::date, '1d') as d(day) 
    left outer join users as u on u.date_created >= d.day and u.date_created < d.day + '1d'::interval 
    -- or left outer join users as u on date_trunc('day', u.date_created) = d.day 
    -- but I think that >= and < will be faster if you have index on `date_created` 
group by d.day 
+1

을 > = 또는 <. 월요일이고 나는 오늘 새로운 것을 배웠습니다. 감사! :) 쿼리는 작동하지만 완벽하지는 않습니다. 잘못된 결과를줍니다. generate_series가 타임 존스로 타임 스탬프를 반환하고 타임 스탬프가 ** '사용자'관계에 ** 타임 존이 없기 때문에 발생했을 것입니다. 자기. 큰 감사를 드린다! – ex3v