Понимание работы windows function postgresql

Неработает оконная функция относительно динамически изменяющихся данных->

count("Transaction_ID")
           filter (where "Transaction_DateTime" between VP."First_Group_Purchase_Date"
           and VP."Last_Group_Purchase_Date") over (partition by VP."Customer_ID") AS TEST2

Каким образом исправить запрос чтобы он работал подобно следующему вызову ->

(select count("Transaction_ID")
        from v_periods as ii
                 join v_history ON ii."Customer_ID" = v_history."Customer_ID" AND
                                   ii."Group_ID" = v_history."Group_ID"
        where ii."Customer_ID" = VP."Customer_ID"
          and v_history."Transaction_DateTime" between VP."First_Group_Purchase_Date"
            and VP."Last_Group_Purchase_Date") AS TEST3

Имеется следующее задание:


Определение общего количества транзакций клиента. Определяется общее количество транзакций клиента, совершенных им между первой и последней транзакциями с анализируемой группой (включая транзакции, в рамках которых не было анализируемой группы), включая первую и последнюю транзакции с группой. Для этого подсчитывается количество уникальных значений в поле Transaction_ID таблицы История покупок, дата совершения транзакций для которых больше или равна дате первой транзакции клиента с группой (значение поля First_Group_Purchase_Date таблицы Периоды) и меньше или равна дате последней транзакции клиента с группой (значение поля Last_Group_Purchase_Date таблицы Периоды).


введите сюда описание изображения

введите сюда описание изображения

введите сюда описание изображения


Имеется следующее решение:

SELECT VP."Customer_ID" AS "Customer_ID",
       VP."Group_ID"    AS "Group_ID",

       count("Transaction_ID")
           filter (where "Transaction_DateTime" between '2020-01-26 23:45:29.000000'
           and '2020-06-01 00:30:27.000000') over (partition by VP."Customer_ID") AS TEST1,

       count("Transaction_ID")
           filter (where "Transaction_DateTime" between VP."First_Group_Purchase_Date"
           and VP."Last_Group_Purchase_Date") over (partition by VP."Customer_ID") AS TEST2,

       "Group_Purchase"::float ,

       (select count("Transaction_ID")
        from v_periods as ii
                 join v_history ON ii."Customer_ID" = v_history."Customer_ID" AND
                                   ii."Group_ID" = v_history."Group_ID"
        where ii."Customer_ID" = VP."Customer_ID"
          and v_history."Transaction_DateTime" between VP."First_Group_Purchase_Date"
            and VP."Last_Group_Purchase_Date") AS TEST3
FROM v_periods AS VP
         JOIN v_history AS VH ON VP."Customer_ID" = VH."Customer_ID" AND
                                 VP."Group_ID" = VH."Group_ID";

ВОПРОС:

Имеется 3 решения, которые подписаны как TEST 1, 2 и 3. Почему работают решения 1 и 3, но при этом решение TEST 2 выводит количество транзакций в пределах группы равным всем транзакциям для определённого покупателя, я до сих пор не могу понять First_Group_Purchase_Date и Last_Group_Purchase_Date подставляют не то, что от них требуется. На примере 7 группы первого покупателя, это различие сразу видно.

введите сюда описание изображения


Ответы (0 шт):