满足特定条件时排除行

时间:2019-12-17 05:13:27

标签: sql-server tsql

每当有人“登录”一个额外的事件(登录)并将其存储在表中时,我想排除行ID的2、4、7、9。我们要排除在“ LoggedOn”事件10分钟之后发生的那些登录事件。

RowID     LoginDateTime         Activity
----------------------------------------    
1         2019-11-19 10:12 A.M  LoggedOn
**2**     2019-11-19 10:12 A.M  Login
3         2019-11-22 11:53 A.M  LoggedOn
**4**     2019-11-22 11:53 A.M  Login
5         2019-11-28 10:52 A.M  LoggedOn
6         2019-12-02 12:08 P.M  LoggedOn
**7**     2019-12-02 12:08 P.M  Login
8         2019-12-13 10:18 A.M  LoggedOn
**9**     2019-12-13 10:19 A.M  Login
10        2019-12-13 10:29 A.M  Login
11        2019-12-13 10:39 A.M  LoggedOff

2 个答案:

答案 0 :(得分:0)

我们可以在此处使用LAG和CTE:

WITH cte AS (
    SELECT *,
        LAG(LoginDateTime, 1, LoginDateTime) OVER (ORDER BY LoginDateTime) AS LoginDateTimeLag,
        LAG(Activity) OVER (ORDER BY LoginDateTime) As ActivityLag
    FROM yourTable
)

SELECT
    RowID,
    LoginDateTime,
    Activity
FROM cte
WHERE
    ActivityLag <> 'LoggedOn' OR
    Activity <> 'Login' OR
    DATEDIFF(minute, LoginDateTimeLag, LoginDateTime) <= 10;

Demo

注意:我将LoginDateTime的默认值用作同一列值本身。这样可以确保,对于表中的最早记录,WHERE子句将通过,并且该记录将包含在结果集中。

还请注意,您的样本数据应使用您在问题中实际描述的过滤逻辑返回每条记录。在演示中,我间隔了记录2、4、7和9,以使他们的登录时间比以前的记录多了10分钟。

答案 1 :(得分:0)

create table #temp(RowID int,LoginDateTime datetime,Activity varchar(15))
insert into #temp values  
(1      ,'2019-11-19 10:12','LoggedOn')
,(2  ,'2019-11-19 10:12','Login')
,(3      ,'2019-11-22 11:53','LoggedOn')
,(4  ,'2019-11-22 11:53','Login')
,(5      ,'2019-11-28 10:52','LoggedOn')
,(6      ,'2019-12-02 12:08','LoggedOn')
,(7  ,'2019-12-02 12:08','Login')
,(8      ,'2019-12-13 10:18','LoggedOn')
,(9  ,'2019-12-13 10:19','Login')
,(10     ,'2019-12-13 10:29','Login')
,(11     ,'2019-12-13 10:39','LoggedOff')

;With CTE as
(
select t.RowID from #temp t
cross apply(select top 1 RowID from #temp t1 where t1.Activity='LoggedOn' 
and datediff(minute,t1.LoginDateTime,t.LoginDateTime)<10
order by t1.LoginDateTime)ca
where  t.Activity='Login' 
)
select * from #temp t
where not exists(select 1 from CTE c where t.rowid=c.rowid)

drop table #temp