每隔15天对数据分组

时间:2019-04-18 11:14:08

标签: sql sql-server tsql group-by

我需要选择所有去年在同一类别(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
)

我认为我应该首先按日期范围分组,然后再进行计数。但是我不知道该怎么办。我读了如何按周分组,但这不是我所需要的,因为帖子可以来自不同的周。

最后,我应该只获取用户列表。

2 个答案:

答案 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