Получить пользователей, которые обновляют пакет после истечения срока действия - PullRequest
1 голос
/ 16 июня 2019

У меня есть таблица, которая дает информацию о том, какие пользователи купили пакет, когда он запустился, срок его действия истек и т.д.

таблица:

+------+--------------+------------+------------+---------+
| user | Package_Type |   Start    |    End     | Status  |
+------+--------------+------------+------------+---------+
|  111 | A            | 2019-06-01 | 2019-06-18 | Valid   |
|  123 | A            | 2019-06-01 | 2019-06-18 | Valid   |
|  124 | A            | 2019-06-02 | 2019-06-06 | Expired | //Type A expired
|  124 | C            | 2019-06-02 | 2019-06-18 | Valid   |
|  125 | B            | 2019-06-03 | 2019-06-09 | Expired |
|  126 | B            | 2019-06-04 | 2019-06-20 | Valid   |
|  127 | B            | 2019-06-04 | 2019-06-07 | Expired |  // Type B expired
|  124 | B            | 2019-06-06 | 2019-06-18 | Valid   |  //Renewal to type B after expiry of type A
|  127 | B            | 2019-06-08 | 2019-06-18 | Valid   |  // Renwal to Type B
+------+--------------+------------+------------+---------+

За промежуток времени (пусть таймфрейм будет WHERE start BETWEEN '2019-06-01' AND '2019-06-10') Я хотел бы узнать, сколько пользователей, срок действия пакета которых истек, обновили его.

Ожидаемый результат выглядит следующим образом

+------------+---------+---------+
|    Date    | Expired | Renewed |
+------------+---------+---------+
| 2019-06-01 |       0 |       0 |
| 2019-06-02 |       0 |       0 |
| 2019-06-03 |       0 |       0 |
| 2019-06-04 |       0 |       0 |
| 2019-06-05 |       0 |       0 |
| 2019-06-06 |       1 |       1 | // Expiry and renewal of user 124
| 2019-06-07 |       1 |       0 | // Expiry of user 127
| 2019-06-08 |       0 |       1 |//  Renewal of user 127
| 2019-06-09 |       1 |       0 |// Expiry of user 125
| 2019-06-10 |       0 |       0 |
+------------+---------+---------+

Нет необходимости, чтобы пользователь обновлял пакет такого же типа.

  1. Для пользователя 124 Тип A истек, но он обновлен до Типа B. (Также обратите внимание, что пользователь 124 все еще активен для типа C).
  2. Так что могут быть случаи, когда срок действия типа пакета истекает, но тот же пользователь может быть активным в каком-то другом пакете, и он может обновиться до некоторого другого пакета.
  3. Я просто хочу знать после истечения срока действия пакета, когда пользователь обновляется (даже если он активен в любом другом пакете)

Обновление 1 Я также хотел, чтобы вышеуказанные данные были представлены как

+--------------+---------+---------+
| Package_Type | Expired | Renewed |
+--------------+---------+---------+
| A            |       1 |       0 |
| B            |       2 |       2 |
| C            |       0 |       0 |
+--------------+---------+---------+

Я хотел запрос, в котором, если я изменю WHERE start BETWEEN '2019-06-01' AND '2019-06-10') *

Таблица выше будет обновлена ​​в соответствии с start filter

Ссылка на SQL Server

1 Ответ

1 голос
/ 16 июня 2019

Вы можете использовать совокупный max(), чтобы получить пользователей, которые обновили:

select t1.*,
       (case when max(case when status = 'expired' then [start] end) over (partition by user order by [start]) < [start] and
                  status = 'Valid'
             then 1 else 0
        end) as renewed
from table1 t1;

Затем вы можете использовать эту информацию для обобщения данных.Однако это обобщение довольно сложно.Продления рассчитываются на дату начала, но истекает на дату истечения.Чтобы справиться с этим, он отменяет данные, используя apply.

select dte, sum(is_expire), sum(is_renew)
from (select t1.*,
             (case when max(case when status = 'expired' then [start] end) over (partition by user order by [start]) < start and
                        status = 'Valid'
                   then 1 else 0
              end) as renewed
      from table1 t1
     ) t1 cross apply
     (values (start, 0, renewed),
             ([end], case when status = 'expired' then 1 else 0 end, 0)
     ) v(dte, is_expire, is_renew)
group by dte
order by dte;

Здесь - SQLFiddle.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...