在第一次发生的 N 天内计数事件
Posted
技术标签:
【中文标题】在第一次发生的 N 天内计数事件【英文标题】:count events within N days of first occurrence 【发布时间】:2017-05-27 17:11:58 【问题描述】:我在表格中有一系列行(各种文章的浏览量),其中包含 URL 和时间戳列,我想查看每篇文章在第一次浏览量的 N 天内的浏览量总数。
我可以使用“GROUP BY url”来查看每篇文章的总浏览量,我可以使用 WHERE 子句仅计算某个硬编码日期范围内的浏览量,但我需要为每个文章自定义该日期范围唯一的网址。
我相信我可以使用 MIN() 来查找每个 URL 的第一次出现,但我需要以某种方式将这些 MIN() 值与 WHERE 子句一起使用。我想我需要使用 JOIN,但我似乎无法弄清楚这种语法。非常感谢您的帮助!
【问题讨论】:
请分享table structure
,您尝试过的查询和预期的结果集。仅仅通过问题可能无法构建有效的查询。
【参考方案1】:
几乎和你解释的完全一样。
带有JOIN
的版本
SELECT v.url, COUNT(*) views
FROM pageviews v JOIN (
SELECT url, MIN(viewed_at) first_viewed_at
FROM pageviews
GROUP BY url
) f
ON v.url = f.url
WHERE v.viewed_at < f.first_viewed_at + INTERVAL 3 DAY
GROUP BY v.url;
具有相关子查询的版本
SELECT url, COUNT(*) views
FROM pageviews v
WHERE viewed_at < (
SELECT MIN(viewed_at)
FROM pageviews
WHERE url = v.url
) + INTERVAL 3 DAY
GROUP BY v.url;
这是一个dbfiddle 演示
【讨论】:
太好了,谢谢!我正在通过 Redash 查询 Redshift,它在“+ INTERVAL 3 DAY”上给出了语法错误。我只尝试了“+ 3”,这似乎工作正常。 你应该首先提到红移。+3
应该可以工作,或者您可以显式使用 DATEADD(day, 3, f.first_viewed_at)
以上是关于在第一次发生的 N 天内计数事件的主要内容,如果未能解决你的问题,请参考以下文章
我不了解 cachegrind 与 perf 工具之间的缓存未命中计数
2022-05-27:现在有N条鱼,每条鱼的体积为Ai,从左到右排列,数组arr给出。 每一轮,左边的大鱼一定会吃掉右边比自己小的第一条鱼, 并且每条鱼吃比自己小的鱼的事件是同时发生的。 返回多少轮之