我正在尝试为dellstore2数据库累计计算用户数。在这里和其他论坛上寻找答案时,我使用了这个
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
对于整个事情,我明白了
8996
这与第一个输出11,681中的最后一项不一致。我猜上面的计算无法确定整个月的唯一性。什么是最快的计算方式(最好不使用自联接)?
除了直接从订单中选择之外,还可以使用如下子查询:
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