2012-06-12 2 views
5

dellstore2 데이터베이스에 대해 누적 사용자 수를 계산하려고합니다. 여기에 대한 답변 및 기타 포럼을 보면, 나는이누적 월간 누적 합계 및 Postgresql

select 
date_trunc('month',orderdate), 
sum(count(distinct(customerid))) 
    over (order by date_trunc('month',orderdate)) 
from orders group by date_trunc('month',orderdate) 

을 반환 사용
2004-01-01 00:00:00.0 979 
2004-02-01 00:00:00.0 1,952 
2004-03-01 00:00:00.0 2,922 
2004-04-01 00:00:00.0 3,898 
2004-05-01 00:00:00.0 4,873 
2004-06-01 00:00:00.0 5,846 
2004-07-01 00:00:00.0 6,827 
2004-08-01 00:00:00.0 7,799 
2004-09-01 00:00:00.0 8,765 
2004-10-01 00:00:00.0 9,745 
2004-11-01 00:00:00.0 10,710 
2004-12-01 00:00:00.0 11,681 

매달입니다

979 
973 
970 
976 
975 
973 
981 
972 
966 
980 
965 
971 
그것은 처음 몇보고, 잘 총 것으로 보인다

항목. 나는 전체 일에 대한

select count(distinct(customerid)) from orders 

을 실행했을 때, 나는 처음 출력 11681의 마지막 항목에 동의하지 않는

8996 

를 얻을. 위의 계산으로 월별 고유성을 결정할 수 없다고 생각합니다. 이 계산을위한 가장 빠른 방법은 무엇입니까? 자체 조인을 사용하지 않는 것이 좋습니다.

+1

일부 고객은 물건을 두 번 이상 구입 했습니까? 다른 달에? –

+0

@ NikolaMarkovinović 당신 말이 맞아요. 그 대답에 대한 답을 만들어야합니다 ... –

+0

@pOcHa 님의 댓글을 삭제 하시려 고합니다. :-) –

답변

7

대신 주문에서 직접 선택, 당신은과 같이 하위 쿼리를 사용할 수 있습니다

SELECT OrderDate, 
     SUM(COUNT(DISTINCT customerid)) OVER (ORDER BY OrderDate) 
FROM ( SELECT CustomerID, 
        DATE_TRUNC('MONTH', MIN(OrderDate)) AS OrderDate 
      FROM Orders 
      GROUP BY CustomerID 
     ) AS Orders 
GROUP BY OrderDate 

내가 필요에 따라이 작업을 거라고 생각해. 당신은 여전히 ​​두 가지 방법을 모두 필요한 경우

http://sqlfiddle.com/#!1/7a8cc/1

편집

(즉 별개의 실행 전체) 당신은이를 사용할 수 있습니다

SELECT OrderDate, 
     COUNT(DISTINCT CustomerID) AS MonthTotal, 
     SUM(COUNT(DISTINCT customerid)) OVER (ORDER BY OrderDate) AS CumulativeTotal, 
     SUM(COUNT(DISTINCT CASE WHEN OrderNumber = 1 THEN customerid END)) OVER (ORDER BY OrderDate) AS CumulativeDistinctTotal 
FROM ( SELECT CustomerID, 
        OrderDate, 
        ROW_NUMBER() OVER(PARTITION BY CustomerID ORDER BY OrderDate) AS OrderNumber 
      FROM Orders 
     ) AS Orders 
GROUP BY OrderDate 

예 여기 :

http://sqlfiddle.com/#!1/7a8cc/10

+2

+1 - 아주 좋은 생각 배트맨. 실제로 작동하는 – MatBailie

+0

, 나는 이유를 모른다. :) 나는 그것을 이해하려고 노력할 것이다. 고마워. – user423805

+1

첫 번째 방법은 중복을 제거하기 위해'COUNT (DISTINCT CustomerID)'를 사용하는 대신, 카운트중인 데이터 세트를 그룹화하여 제거하므로 카운트에서'DISTINCT '없이 동일한 결과를 얻을 수 있습니다. 두 번째 것은 기본적으로 원래의 쿼리와 동일하며 추가 'ROW_NUMBER' 열이 집합에 추가되어 각 고객의 첫 번째 주문을 식별하는 데 사용되므로 모든 주문과 고유 고객을 집계 할 수 있습니다. – GarethD