Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
累计月度总计和Postgresql_Sql_Postgresql - Fatal编程技术网

累计月度总计和Postgresql

累计月度总计和Postgresql,sql,postgresql,Sql,Postgresql,我试图计算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 20

我试图计算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

与第一个输出11681中的最后一项不一致。我猜上面的计算无法确定几个月内的唯一性。最快的计算方法是什么,最好不使用自联接

您可以使用如下子查询,而不是直接从订单中选择:

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
我认为这将按要求工作

编辑

如果您仍然需要这两种方法(即distinct和running total),您可以使用以下方法:

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
示例如下:


有些客户是否不止一次购买物品?在不同的月份?@NikolaMarkovinović你是对的,你应该回答这个问题…@pOcHa Od svih gradova,moj omiljeni Niš…-)@尼古拉·马尔科维诺维奇·哈哈哈、乔斯莫·伊曼扎奇、扎斯塔维库什的一位波比·埃莫·维洛瓦蒂诺·波普·波普·波普·波普·波普·波普·波普·波普·波普·波普·波普·波普·波普·波普·波普·波普·波普·波普·波普·波普·波普·波普·波这确实有效,我不知道为什么。:)我会尽力去理解它。thx.第一种方法之所以有效,是因为没有使用
COUNT(DISTINCT CustomerID)
删除重复项,而是通过对正在计数的数据集进行分组来删除重复项,这样您就可以在计数中没有
DISTINCT
的情况下获得相同的结果。第二个基本上与原始查询相同,在集合中添加了一个额外的
行\号
列,用于标识每个客户的第一个订单,因此可以统计所有订单和不同的客户。