使用Dense Rank模拟Count(Distinct) but 运行成一道题
Using Dense Rank to simulate Count(Distinct) but running into a problem
由于 SQL 不允许我对 Window 函数进行 Distinct 计数,我必须使用密集等级来实现我想要做的事情。
我的说法是:
,DENSE_RANK() over (partition by CustomerEmail order by Date_Created asc)
+DENSE_RANK() over (partition by CustomerEmail order by Date_Created desc)
-1 as AmountOrdersOverRangeByCustomer
这让我知道客户(使用电子邮件来识别)下订单的时间。因此,如果他在一段时间内下了 5 个订单,订单数将变为 5、5、5、5 和 5。
问题是,如果他在同一天下了两个订单 (Date_Created)。然后 Dense_Rank 不将其计为 2,2,而是将其计为 1,1... 我认为这是它应该如何运行,而不是我想要的方式。有谁知道修复?使用 Row_Number 而不是 Dense_Rank 会解决这个问题吗?
您的代码应该可以工作,尽管我通常为此目的使用子查询:
SELECT . . .
MAX(dr) OVER (PARTITION BY CustomerEmail) as AmountOrdersOverRangeByCustomer
FROM (SELECT . . .,
DENSE_RANK() over (partition by CustomerEmail order by Date_Created asc) as dr
. . .
) . . .
但是,如果您想将同一天的两个订单计为两个,而不是一个,那么您可能根本不需要 COUNT(DISTINCT)
,只需:
COUNT(*) OVER (PARTITION BY CustomerEmail)
您的查询正在计算每个客户电子邮件的 DISTINCT Date_Created。
如果你想计算 "how much times a customer places an order" 你应该使用常规计数,比如:
COUNT(*) over (partition by CustomerEmail)
由于 SQL 不允许我对 Window 函数进行 Distinct 计数,我必须使用密集等级来实现我想要做的事情。
我的说法是:
,DENSE_RANK() over (partition by CustomerEmail order by Date_Created asc)
+DENSE_RANK() over (partition by CustomerEmail order by Date_Created desc)
-1 as AmountOrdersOverRangeByCustomer
这让我知道客户(使用电子邮件来识别)下订单的时间。因此,如果他在一段时间内下了 5 个订单,订单数将变为 5、5、5、5 和 5。
问题是,如果他在同一天下了两个订单 (Date_Created)。然后 Dense_Rank 不将其计为 2,2,而是将其计为 1,1... 我认为这是它应该如何运行,而不是我想要的方式。有谁知道修复?使用 Row_Number 而不是 Dense_Rank 会解决这个问题吗?
您的代码应该可以工作,尽管我通常为此目的使用子查询:
SELECT . . .
MAX(dr) OVER (PARTITION BY CustomerEmail) as AmountOrdersOverRangeByCustomer
FROM (SELECT . . .,
DENSE_RANK() over (partition by CustomerEmail order by Date_Created asc) as dr
. . .
) . . .
但是,如果您想将同一天的两个订单计为两个,而不是一个,那么您可能根本不需要 COUNT(DISTINCT)
,只需:
COUNT(*) OVER (PARTITION BY CustomerEmail)
您的查询正在计算每个客户电子邮件的 DISTINCT Date_Created。
如果你想计算 "how much times a customer places an order" 你应该使用常规计数,比如:
COUNT(*) over (partition by CustomerEmail)