Логика регистрации для Abandon # - PullRequest
0 голосов
/ 01 апреля 2019

Я пытаюсь найти метрику Abandon # для данных регистрации с MS SQL.Количество пользователей, начавших регистрацию, не завершило регистрацию в течение 1 календарного дня.Начало регистрации будет обозначено Сведения о состоянии = 'NextButton' .Также я хочу исключить пользователей, которые начали регистрацию, но их учетная запись уже существует, что обозначено statusDetail = 'ExistingAccount'.

Logic : попытка регистрации, которая не была выполненазавершить успешную регистрацию в течение 1 календарного дня.

Код начинается с базовых фильтров

            SELECT *
            FROM   Report.rpt.Logs
            WHERE EventName = 'Login' AND EventType='Enrollment'

Фактические данные:

+-------------------------+----------------+-----------+------------+----------------------+
|     TransactionDate     |  ServiceLogId  | EventName | EventType  |     StatusDetail     |
+-------------------------+----------------+-----------+------------+----------------------+
| 2000-01-01 00:00:00.000 | ss@gmail.com   | LOGIN     | Enrollment | NextButton           |
| 2015-05-12 06:53:02.957 | cvbb@gmail.com | LOGIN     | Enrollment | NextButton           |
| 2015-05-12 06:53:38.867 | cvbb@gmail.com | LOGIN     | Enrollment | ExistingAccount      |
| 2015-03-01 06:53:45.187 | abc@gmail.com  | LOGIN     | Enrollment | NextButton           |
| 2015-03-05 06:53:45.187 | vrc@gmail.com  | LOGIN     | Enrollment | NextButton           |
| 2015-04-23 06:53:45.187 | sr@gmail.com   | LOGIN     | Enrollment | NextButton           |
| 2015-04-23 06:55:47.187 | sr@gmail.com   | LOGIN     | Enrollment | Successfully Created |
+-------------------------+----------------+-----------+------------+----------------------+

Ожидаемые результаты

+--------------------------+----------------+-----------+------------+--------------+
|      TransactionDate     |  ServiceLogId  | EventName | EventType  | StatusDetail |
+--------------------------+----------------+-----------+------------+--------------+
|  2000-01-01 00:00:00.000 | ss@gmail.com   | LOGIN     | Enrollment | NextButton   |
|  2015-03-01 06:53:45.187 | abc@gmail.com  | LOGIN     | Enrollment | NextButton   |
|  2015-03-05 06:53:45.187 | vrc@gmail.com  | LOGIN     | Enrollment | NextButton   |
+--------------------------+----------------+-----------+------------+--------------+

Ответы [ 2 ]

1 голос
/ 01 апреля 2019

Это хорошее применение предложения WHERE NOT EXISTS.Два NOT EXISTS ниже каждого отфильтровывают один из ваших критериев.

SELECT
  *
FROM
  @logs AS l
WHERE
  l.EventName = 'LOGIN'
  AND l.EventType = 'Enrollment'
  AND l.StatusDetail = 'NextButton'
  AND NOT EXISTS
(--Filter off Existing Accounts
  SELECT
    1
  FROM
    @logs AS s
  WHERE
    s.ServiceLogId = l.ServiceLogId
    AND s.StatusDetail = 'ExistingAccount'
)
  AND NOT EXISTS
(--Filter off logins where enrollment was Successfully Created
 --within 1 calendar day. 
  SELECT
    1
  FROM
    @logs AS s
  WHERE
    s.ServiceLogId = l.ServiceLogId
    AND s.StatusDetail = 'Successfully Created'
    AND CAST(l.TransactionDate AS DATE) = CAST(s.TransactionDate AS DATE)
);

Результаты:

+-------------------------+---------------+-----------+------------+--------------+
|     TransactionDate     | ServiceLogId  | EventName | EventType  | StatusDetail |
+-------------------------+---------------+-----------+------------+--------------+
| 2000-01-01 00:00:00.000 | ss@gmail.com  | LOGIN     | Enrollment | NextButton   |
| 2015-03-01 06:53:45.187 | abc@gmail.com | LOGIN     | Enrollment | NextButton   |
| 2015-03-05 06:53:45.187 | vrc@gmail.com | LOGIN     | Enrollment | NextButton   |
+-------------------------+---------------+-----------+------------+--------------+

Редактировать: Добавлены дополнительные критерии WHERE кзабрать статус NextButton только для данного пользователя.

0 голосов
/ 01 апреля 2019

Просто необходимо исключить данные журнала обслуживания из запроса

DECLARE @Logs TABLE
(
    Id int IDENTITY(1,1),
    TransactionDate     datetime,
    ServiceLogId    varchar(100),
    EventName   varchar(100),
    EventType   varchar(50),
    StatusDetail    varchar(50)
)

INSERT INTO  @Logs(TransactionDate, ServiceLogId, EventName, EventType,StatusDetail)VALUES('2000-01-01 00:00:00.000' , 'ss@gmail.com'   , 'LOGIN'     , 'Enrollment' , 'NextButton')
INSERT INTO  @Logs(TransactionDate, ServiceLogId, EventName, EventType,StatusDetail)VALUES('2015-05-12 06:53:02.957' , 'cvbb@gmail.com' , 'LOGIN'     , 'Enrollment' , 'NextButton')
INSERT INTO  @Logs(TransactionDate, ServiceLogId, EventName, EventType,StatusDetail)VALUES('2015-05-12 06:53:38.867' , 'cvbb@gmail.com' , 'LOGIN'     , 'Enrollment' , 'ExistingAccount')
INSERT INTO  @Logs(TransactionDate, ServiceLogId, EventName, EventType,StatusDetail)VALUES('2015-03-01 06:53:45.187' , 'abc@gmail.com' , 'LOGIN'     , 'Enrollment' , 'NextButton')
INSERT INTO  @Logs(TransactionDate, ServiceLogId, EventName, EventType,StatusDetail)VALUES('2015-03-05 06:53:45.187' , 'vrc@gmail.com'  , 'LOGIN'     , 'Enrollment' , 'NextButton')
INSERT INTO  @Logs(TransactionDate, ServiceLogId, EventName, EventType,StatusDetail)VALUES('2015-04-23 06:53:45.187' , 'sr@gmail.com'   , 'LOGIN'     , 'Enrollment' , 'NextButton')
INSERT INTO  @Logs(TransactionDate, ServiceLogId, EventName, EventType,StatusDetail)VALUES('2015-04-23 06:55:47.187' , 'sr@gmail.com'   , 'LOGIN'     , 'Enrollment' , 'Successfully Created' )

SELECT * FROM @Logs l
WHERE l.StatusDetail ='NextButton'
AND l.ServiceLogId NOT IN(SELECT ServiceLogId FROM @Logs l2 WHERE l2.StatusDetail IN ('ExistingAccount','Successfully Created' ))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...