获取联系人在一分钟内有 20 个活动的行 - SQL 查询 [重复]

Posted

技术标签:

【中文标题】获取联系人在一分钟内有 20 个活动的行 - SQL 查询 [重复]【英文标题】:Get rows where contact has 20 activities within a minute - SQL query [duplicate] 【发布时间】:2020-07-28 21:21:08 【问题描述】:

我们正在为联系人和他们访问的每个页面收集一些分析数据。许多分析数据来自恶意攻击或机器人,因此它们在一分钟内访问了该网站的 20 多个页面。我希望能够每天清除一次这些数据,但不知道如何编写一个 SQL 查询,该查询将选择该联系人在一分钟内访问超过 20 页的所有行,不仅仅是过去一分钟,而是全天。我将如何编写查询以获取在一分钟内有 20 多个活动组的联系人的活动行?

分析表有 DateCreated、ContactID、ActivityName、ActivityUrl

样本数据(假设在一分钟内超过 3 个):

2020-07-25 23:59:58, 78, Page visit, /home  
2020-07-25 23:59:57, 78, Page visit, /home/1  
2020-07-25 23:59:58, 34, Page visit, /home/2  
2020-07-25 23:59:56, 78, Page visit, /home/3  
2020-07-25 23:59:55, 78, Page visit, /home/4  
2020-07-25 23:59:52, 34, Page visit, /home  
2020-07-25 23:59:52, 78, Page visit, /home/5   
2020-07-25 23:59:51, 34, Page visit, /home/5   
2020-07-25 23:59:50, 34, Page visit, /home/6        
2020-07-25 21:34:02, 764, Page visit, /home   
2020-07-25 22:11:01, 78, Page visit, /home/9    

所需数据:

2020-07-25 23:59:58, 78, Page visit, /home  
2020-07-25 23:59:57, 78, Page visit, /home/1  
2020-07-25 23:59:56, 78, Page visit, /home/3  
2020-07-25 23:59:55, 78, Page visit, /home/4   
2020-07-25 23:59:52, 78, Page visit, /home/5   
2020-07-25 23:59:58, 34, Page visit, /home/2  
2020-07-25 23:59:52, 34, Page visit, /home    
2020-07-25 23:59:51, 34, Page visit, /home/5  
2020-07-25 23:59:50, 34, Page visit, /home/6  

【问题讨论】:

@user6383418 。 . .您基本上已经问过同样的问题,但还没有回答那里的答案。 【参考方案1】:

您可以使用两个级别的窗口函数来做到这一点。第一级计算每contactID 和每分钟的请求数,然后第二级计算每contactID 和每天第一次计算的最大计数。最后一步是过滤:

select *
from (
    select 
        t.*,
        max(cnt_minute) over(partition by ContactID, date(DateCreated)) max_cnt_minute
    from (
        select 
            t.*,
            count(*) over(partition by 
                ContactID,
                dateadd(minute, datediff(minute, 0, DateCreated), 0)
            ) cnt_minute
        from mytable t
    ) t
) t
where max_cnt_minute > 20

您可以使用可更新的 CTE 轻松地将其转换为 delete 语句(这似乎是您的实际意图):

with cte as (

    select 
        t.*,
        max(cnt_minute) over(partition by ContactID, date(DateCreated)) max_cnt_minute
    from (
        select 
            t.*,
            count(*) over(partition by 
                ContactID,
                dateadd(minute, datediff(minute, 0, DateCreated), 0)
            ) cnt_minute
        from mytable t
    ) t
)
delete from cte where max_cnt_minute > 20

【讨论】:

以上是关于获取联系人在一分钟内有 20 个活动的行 - SQL 查询 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

1个GPU几分钟搞定强化学习训练

复制活动中的容错通过跳过不兼容的行

牛客题霸-SQL篇——10~20题

获取5分钟前的行[重复]

从 android 设备获取超过 10000 个联系人

如何获取联系方式?