如何设计一个SQL查询,向我显示在24小时内过去20次访问至少一个页面的所有用户?

时间:2017-09-20 14:46:39

标签: sql amazon-athena

为了识别人流量(而不是爬虫,机器人等),我想设计一个SQL查询,它将识别在过去20小时内访问过网站的所有唯一访客ID(与大多数人一样)不会那么长时间浏览)。我相信我理解我想要如何构建它,“过去24小时内每个访问者有多少个独特的小时活动,而且至少有一些活动在20个小时内”。

虽然这种查询的细节取决于所涉及的表格,但我无法理解我的结构是否在正确的轨道上:

SELECT page_url, affinity, num
FROM (
 SELECT AGG GROUP BY visitor_id, pages.page_url, max(v.max_affinity) as affinity, COUNT(*) as num, Row_Number()
   OVER (Partition By v.visitor_id ORDER BY COUNT(visitor_id) DESC) AS RowNumber
 FROM audience_lab_active_visitors v
 SELECT pages ON pages.p_date >= '2017-09-14'
 WHERE v.p_date='2017-09-14'
 GROUP BY v.vispage_visitors, pages.page_url
) tbl WHERE RowNumber < 20 

1 个答案:

答案 0 :(得分:0)

我不认为您的查询是有效的SQL,但是我对您要完成的工作有所了解。我不使用静态日期,而是按过去24小时进行过滤,并将当前时间戳缩短为小时,否则查询将考虑25个唯一小时。我还从查询中删除了page_url,因为它似乎与基于您要解决的问题的结果无关。

对于每个visitor_id,查询都会根据用于记录页面视图时间戳的列(在本示例中为timestamp_col)对记录的唯一小时数进行计数。 HAVING COUNT(DISTINCT DATE_TRUNC('hour', timestamp_col)) < 20会返回您在人类身上发现的那些信息,这意味着他们在过去24小时内最多访问了该网站。

SELECT
  visitor_id,
  COUNT(DISTINCT DATE_TRUNC('hour', timestamp_col)) AS num,
  MAX(v.max_affinity) AS affinity
FROM audience_lab_active_visitors AS v
  JOIN pages AS p ON v.page_url = p.page_url
WHERE
  v.p_date >= DATE_TRUNC('hour', CURRENT_TIMESTAMP) - INTERVAL '24' hour
GROUP BY 1
HAVING COUNT(DISTINCT DATE_TRUNC('hour', timestamp_col)) < 20;