我们目前正在从以下实体中抽取前5天的搜索结果,这些实体按搜索次数排序,以进行最近N天的搜索(请参阅下面的查询中的有效搜索日期)。
SELECT *, count(t.searchterms)
FROM searchRecords t
WHERE t.SearchDate >= effectiveSearchDate
GROUP BY t.searchTerms
ORDER BY count(t.searchTerms) DESC
LIMIT 5;
在这里, effectiveSearchDate
是您要从顶部开始搜索直到日期的日期,对于最近5天以来的顶部搜索结果说'2019-04-01 00:00:00'
。
现在,为了避免搜索垃圾邮件(任何用户连续多次搜索特定词只是为了使它出现在顶部搜索中),我们在此现有实体中引入了userId
列,并希望更新查询它将忽略用户在指定时间段(例如2小时)内针对特定搜索词的任何此类垃圾邮件搜索。
例如:让我们进一步分析上方搜索量最高的术语-“投票日”:
选择*从SearchRecords 搜索字词是“投票日”;
在这里,如果您仅注意到这3个用户多次搜索了此关键字。因此,我们希望舍弃用户在n-Hrs(例如2小时)的指定时间段内进行的多次搜索,即将用户在2小时内对某个特定字词的所有搜索都计为一个(1)。 ,此搜索词的最终计数-“投票日” 应该是 3 而不是 12 ,并且对于所有搜索计数都应类似。
答案 0 :(得分:0)
让我们先编写逻辑方法-
使用ROW_NUMBER()添加新列“ valid_search_flag”,逻辑应为
分区依据-
订购者-
生成 valid_search_flag 的逻辑为:
ROW_NUMBER()OVER(按用户ID,搜索词,FORMAT(搜索日期, '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)格式(搜索日期,“ hh”)/ 3 -> 小时(搜索日期)/ 3