获取联系人在一分钟内有 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 查询 [重复]的主要内容,如果未能解决你的问题,请参考以下文章