我们目前正在从搜索计数排序的下面实体中抽取前5个搜索,用于在过去N天内进行的搜索(请参阅以下查询中的effectiveSearchDate)。
SELECT *, count(t.searchterms)
FROM searchRecords t
WHERE t.SearchDate >= effectiveSearchDate
GROUP BY t.searchTerms
ORDER BY count(t.searchTerms) DESC
LIMIT 5;
其中,effectiveSearchDate
是您希望从最高搜索结果到目前为止的日期,比如'2019-04-01 00:00:00'
自过去5天以来的最佳搜索结果。
现在,为了避免搜索垃圾邮件(任何用户连续多次搜索特定术语以便在顶级搜索中提出),我们向现有实体引入了userId
列,并希望更新将忽略任何此类垃圾邮件搜索的查询用户对指定时间段内的特定搜索项(例如2小时)。
例如:让我们进一步分析“投票日”以上搜索次数最多的词:
SELECT * FROM SearchRecords,其中SearchTerms喜欢“投票日”;
在这里,如果您注意到只有这3个用户多次搜索过此关键字。因此,我们希望丢弃用户在n-Hrs(比如2小时)的指定时间段内完成的多次搜索,即将用户针对2小时范围内的任何特定术语的所有搜索计为一(1)。 ,这个搜索词的最终计数 - “投票日”应该是3而不是12,所有搜索计数也是如此。
让我们先写下逻辑方法 -
使用ROW_NUMBER()添加一个新列'valid_search_flag',逻辑应该是
分区依据 -
订购方式 -
生成valid_search_flag的逻辑是:
ROW_NUMBER()OVER(PARID由BYID,searchterm,FORMAT(searchdate,'yyyy-MM-dd'),FORMAT(searchdate,'hh')/ 3 ORDER BY searchdate)AS valid_search_flag
现在使用过滤器“valid_search_flag = 1”可以过滤所有重复搜索:
WITH CTE AS (SELECT *,
ROW_NUMBER() OVER(PARTITION BY userid,searchterm, FORMAT(searchdate, 'yyyy-MM-dd'), FORMAT(searchdate, 'hh')/3 ORDER BY searchdate) AS valid_search_flag
FROM test.test
)
SELECT *
FROM CTE
WHERE valid_search_flag=1
现在,您可以运行聚合查询。
我已经在SQL Server上成功测试了这个,请在下面进行更改以在mySQL中执行此操作 -
(a)格式(searchdate,'yyyy-MM-dd') - > GET_FORMAT(searchdate,'yyyy-MM-dd')
(b)格式(searchdate,'hh')/ 3 - > HOUR(searchdate)/ 3