我需要选择所有去年在同一类别(sql)中发布了3个以上帖子且间隔少于15天的用户。 问题出在最后一部分,“时间间隔少于15天”。
这是我为2018年和标签选择用户的方式(您可以在https://data.stackexchange.com/stackoverflow/query/new上运行它):
SELECT OwnerUserId, Id, CreationDate
FROM Posts
WHERE OwnerUserId IN (
SELECT OwnerUserId
FROM Posts
WHERE YEAR(Posts.CreationDate) >= 2018 AND YEAR(Posts.CreationDate) < 2019
AND Posts.Tags LIKE '%sql%'
GROUP BY OwnerUserId,PostTypeId
HAVING COUNT(PostTypeId) > 3
)
我认为我应该首先按日期范围分组,然后再进行计数。但是我不知道该怎么办。我读了如何按周分组,但这不是我所需要的,因为帖子可以来自不同的周。
最后,我应该只获取用户列表。
答案 0 :(得分:1)
通过使用窗口功能,您可以获得符合这些条件的帖子。 lead()
可以获取第二条记录之后的第二条记录,然后您可以检查该记录是否在正确的时间段出现。
如果我正确理解了您的术语:
select p.*
from (select p.*,
lead(CreationDate, 2) over (partition by OwnerUserId, PostTypeId order by CreationDate) as CreationDate_2
from posts p
where p.CreationDate >= '2018-01-01' and
p.CreationDate < '2019-01-01' and
p.Tags like '%sql%'
)
where CreationDate_2 < dateadd(day, 15, CreationDate)
答案 1 :(得分:1)
您可以使用带有偏移量参数的LAG
函数来查找前第二条帖子的日期,然后计算日期差:
WITH questions AS (
SELECT OwnerUserId
, CreationDate AS PostDate
, LAG(CreationDate, 2) OVER (PARTITION BY OwnerUserId ORDER BY CreationDate) AS PrevDate
FROM Posts
WHERE OwnerUserId IS NOT NULL -- not community owned
AND PostTypeId = 1 -- questions only
AND CreationDate >= '2018-01-01' -- between 2018
AND CreationDate < '2019-01-01'
AND Tags LIKE '%<sql>%' -- tagged sql
)
SELECT *
FROM questions
WHERE DATEDIFF(DAY, PrevDate, PostDate) <= 14