Использование Dense Rank для симуляции Count (Distinct), но столкновение с проблемой - PullRequest
1 голос
/ 30 мая 2019

Поскольку SQL не позволяет мне считать функции Distinct over Window, мне нужно использовать плотный ранг, чтобы достичь того, что я пытаюсь сделать.

Мое утверждение таково:

,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). Тогда вместо того, чтобы считать его как 2,2, Dense_Rank считает его как 1,1 ... что я думаю, это то, как он должен действовать, а не как я этого хочу. Кто-нибудь знает исправление? Исправит ли это использование Row_Number вместо Dense_Rank?

Ответы [ 2 ]

2 голосов
/ 30 мая 2019

Ваш код должен работать, хотя я чаще использую для этого подзапрос:

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)
0 голосов
/ 30 мая 2019

Ваш запрос считает DISTINCT Date_Created для каждого электронного письма клиента.
Если вы хотите посчитать, «сколько раз клиент размещает заказ», вы должны использовать обычный подсчет, например:

COUNT(*) over (partition by CustomerEmail)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...