Группировать данные с интервалом в 15 дней - PullRequest
1 голос
/ 18 апреля 2019

Мне нужно выбрать всех пользователей, которые разместили более 3 сообщений в одной категории (sql) за последний год с интервалом менее 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 ]

1 голос
/ 18 апреля 2019

Вы можете использовать функцию LAG с параметром смещения, чтобы найти дату 2-го предыдущего поста, а затем вычислить разницу в дате:

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
1 голос
/ 18 апреля 2019

Вы можете получать сообщения, соответствующие этим условиям, используя оконные функции.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)
...