从搜索记录中获取搜索次数最多的字词,忽略给定时间范围内任何用户的搜索字词的任何重复条目(小时)

问题描述 投票:0回答:1

我们目前正在从搜索计数排序的下面实体中抽取前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天以来的最佳搜索结果。

请参阅下面的图片enter image description here

现在,为了避免搜索垃圾邮件(任何用户连续多次搜索特定术语以便在顶级搜索中提出),我们向现有实体引入了userId列,并希望更新将忽略任何此类垃圾邮件搜索的查询用户对指定时间段内的特定搜索项(例如2小时)。

例如:让我们进一步分析“投票日”以上搜索次数最多的词:

SELECT * FROM SearchRecords,其中SearchTerms喜欢“投票日”;

enter image description here

在这里,如果您注意到只有这3个用户多次搜索过此关键字。因此,我们希望丢弃用户在n-Hrs(比如2小时)的指定时间段内完成的多次搜索,即将用户针对2小时范围内的任何特定术语的所有搜索计为一(1)。 ,这个搜索词的最终计数 - “投票日”应该是3而不是12,所有搜索计数也是如此。

mysql sql mysql-5.7
1个回答
0
投票

让我们先写下逻辑方法 -

使用ROW_NUMBER()添加一个新列'valid_search_flag',逻辑应该是

分区依据 -

  • 用户身份
  • 搜索词
  • searchdate的日期部分('yyyy-MM-dd')
  • 搜索日期的小时部分('HH')除以3(3定义此处时间框架3小时)

订购方式 -

  • searchdate

生成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

© www.soinside.com 2019 - 2024. All rights reserved.