Sql server 放弃的注册逻辑

Sql server 放弃的注册逻辑,sql-server,Sql Server,我正在尝试使用MS SQL查找注册数据的放弃度量。开始注册但未在1个日历日内完成注册的用户数量。开始注册将由状态详细信息='NextButton'指示。此外,我想排除已开始注册但其帐户已存在的用户,该帐户由statusDetail='ExistingAccount'指示 逻辑:未在1个日历日内成功完成注册的注册尝试 代码从基本过滤器开始,如下所示 SELECT * FROM Report.rpt.Logs WHERE E

我正在尝试使用MS SQL查找注册数据的放弃度量。开始注册但未在1个日历日内完成注册的用户数量。开始注册将由状态详细信息='NextButton'指示。此外,我想排除已开始注册但其帐户已存在的用户,该帐户由statusDetail='ExistingAccount'指示

逻辑:未在1个日历日内成功完成注册的注册尝试

代码从基本过滤器开始,如下所示

            SELECT *
            FROM   Report.rpt.Logs
            WHERE EventName = 'Login' AND EventType='Enrollment'
实际数据:

预期结果


只需要从查询中排除servicelog数据

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' ))

这是WHERE 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条件,以便仅获取任何给定用户的下一个按钮状态。

这不包括未在1个日历日内成功注册的时间要求。您能否在该示例中添加示例数据和预期结果?相同的数据,相同的预期结果。例如,如果您在最后一行的日期前添加一个月,它将不再满足“一天内”的要求,但此查询最初发布时仍将过滤该用户,因为它仅按状态过滤,而不是按相对日期过滤。非常感谢!这就是我一直在寻找的方法。
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   |
+-------------------------+---------------+-----------+------------+--------------+