为了识别人流量(而不是爬虫,机器人等),我想设计一个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
答案 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;