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