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

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

Date: дата, когда было использовано предложение

user_id: идентификатор для конкретного пользователя

txn_id: идентификатор транзакции, когда пользователь использует предложение. Он всегда уникален в таблице.

Предложение таково, что конкретный пользователь может использовать его 5 раз.

Я хочу знать на каждую дату, сколько пользователей находятся на какой стадии использования предложения.

Например В первый день может быть 3 пользователя, которые использовали предложение один раз (redemption_1), 2 пользователя, которые могли использовать предложение дважды (redemption_2).

Теперь во второй день могут быть пользователи первого дня (постоянные пользователи), а также пользователи, впервые обращающиеся за предложением (новые пользователи).

Для новых пользователей дня 2 логика такая же, как и у пользователей дня 1. (Может быть, 2 новых пользователя используют предложение 1 раз (redemption_1), 3 новых пользователя используют его 3 раза (redemption_3))

Но для постоянных пользователей теперь я хочу добавить туда использование предыдущего дня.

Например В первый день 3 пользователя использовали предложение один раз (redemption_1), но во второй день, если они используют его еще раз, их следует учитывать в redemption_2 (а не в redemption_1, поскольку они используют его во второй раз с момента запуска предложения). / или там последнее использование)

Таким образом, я хочу продолжить кумулятивное добавление количества раз, когда пользователь использовал предложение, и подсчета количества пользователей, которые использовали предложение за 1 раз (redemption_1), 2 раза (redemption_2) и так далее для каждая дата

Таблица

+------------+---------+------------+
|    Date    | user_id |   txn_id   |
+------------+---------+------------+
| 2019-06-04 |       1 | 1ACSA0-ABA |
| 2019-06-04 |       2 | 1BEAA0-CSC |
| 2019-06-04 |       3 | 1AGHF0-CBA |
| 2019-06-04 |       1 | 1AVFA0-GAA |
| 2019-06-05 |       1 | 1BCFA0-AAA |
| 2019-06-05 |       1 | 1AVFB0-GAC |
| 2019-06-05 |       2 | 1AVFA0-GVA |
| 2019-06-05 |       4 | 1AVFA0-GVB |
| 2019-06-05 |       5 | 1AVFA0-BCF |
| 2019-06-06 |       6 | 1AGHF0-CCA |
| 2019-06-06 |       1 | 1BXHF0-CCA |
| 2019-06-06 |       2 | 1AGHF0-CBG |
| 2019-06-06 |       3 | 1AGHF0-CAW |
| 2019-06-06 |       2 | 1AGHF0-CTU |
+------------+---------+------------+

Желаемый выход

+------------+--------------+--------------+--------------+--------------+--------------+
|    Date    | redemption_1 | redemption_2 | redemption_3 | redemption_4 | redemption_5 |
+------------+--------------+--------------+--------------+--------------+--------------+
| 2019-06-04 |            2 |            1 |            0 |            0 |            0 |
| 2019-06-05 |            2 |            1 |            0 |            1 |            0 |
| 2019-06-06 |            1 |            1 |            0 |            1 |            1 |
+------------+--------------+--------------+--------------+--------------+--------------+

Я проведу вас по строкам вывода для лучшего понимания

В первой строке с датой 2019-06-04 есть два пользователя, которые использовали предложение один раз (2,3), и один пользователь, который использовал предложение дважды (1)

В строке с датой 2019-06-05 есть 2 пользователя, которые использовали предложение один раз (4,5). Обратите внимание, что они никогда не использовали предложение до этого, поэтому они учитываются как redemption_1.

В той же строке есть 1 пользователь, который использовал предложение 2 раза (2: один раз на 2019-06-04, а затем на 2019-06-05), поэтому он считается redemption_2

В той же строке находится 1 пользователь, который использовал предложение 4 раза (1: дважды на 2019-06-04, а затем снова дважды на 2019-06-05), поэтому он считается redemption_4

И так далее для строки с датой 2019-06-06

Пожалуйста, дайте мне знать для любого разъяснения

Ответы [ 2 ]

1 голос
/ 09 июля 2019

Не образец эффективности, но он работает.

Данные испытаний:

Create Table offer_used(date DateTime, user_id Int, txn_id Varchar(50))

Insert Into dbo.offer_used (date,
                            user_id,
                            txn_id)
Values
('2019-06-04', 1, '1ACSA0-ABA'),
('2019-06-04', 2, '1BEAA0-CSC'),
('2019-06-04', 3, '1AGHF0-CBA'),
('2019-06-04', 1, '1AVFA0-GAA'),
('2019-06-05', 1, '1BCFA0-AAA'),
('2019-06-05', 1, '1AVFB0-GAC'),
('2019-06-05', 2, '1AVFA0-GVA'),
('2019-06-05', 4, '1AVFA0-GVB'),
('2019-06-05', 5, '1AVFA0-BCF'),
('2019-06-06', 6, '1AGHF0-CCA'),
('2019-06-06', 1, '1BXHF0-CCA'),
('2019-06-06', 2, '1AGHF0-CBG'),
('2019-06-06', 3, '1AGHF0-CAW'),
('2019-06-06', 2, '1AGHF0-CTU')

Запрос:

; With 
Dates As (Select Distinct date From dbo.offer_used OU),
Users As (Select user_id, FirstTime = Min(date) From dbo.offer_used OU Group By user_id),
UserCounts As (Select 
                 Dates.date,
                 Users.user_id,
                 Users.FirstTime,
                 UsedCount = (Select Count(*) From dbo.offer_used As Used
                              Where Used.date <= Dates.date
                                And Used.user_id  = Users.user_id)
               From 
                 Dates 
                 Cross Join Users)
Select 
  date = UserCounts.date,
  [first time today] = Sum(Case When UserCounts.date = UserCounts.FirstTime
                                 And UserCounts.UsedCount = 1 Then 1 Else 0 End),
  [2 times total] = Sum(Case When UserCounts.UsedCount = 2 Then 1 Else 0 End),
  [3 times total] = Sum(Case When UserCounts.UsedCount = 3 Then 1 Else 0 End),
  [4 times total] = Sum(Case When UserCounts.UsedCount = 4 Then 1 Else 0 End),
  [5 times total] = Sum(Case When UserCounts.UsedCount = 5 Then 1 Else 0 End),
  [bonus: never]  = Sum(Case When UserCounts.UsedCount = 0 Then 1 Else 0 End)
From UserCounts
Group By UserCounts.date
Order By UserCounts.date

Результаты:

date        first time today 2 times total 3 times total 4 times total 5 times total bonus: never
----------- ---------------- ------------- ------------- ------------- ------------- ------------
2019-06-04  2                1             0             0             0             3
2019-06-05  2                1             0             1             0             1
2019-06-06  1                1             0             1             1             0
0 голосов
/ 09 июля 2019

Я думаю, вы хотите условное агрегирование:

select t.date,
       sum(case when seqnum = 1 then 1 else 0 end) as redemption_1,
       sum(case when seqnum = 2 then 1 else 0 end) as redemption_2,
       sum(case when seqnum = 3 then 1 else 0 end) as redemption_3,
       sum(case when seqnum = 4 then 1 else 0 end) as redemption_4,
       sum(case when seqnum = 5 then 1 else 0 end) as redemption_5
from (select t.*, row_number() over (partition by user_id order by date) as seqnum
      from table t
     ) t
group by t.date
order by t.date
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...