Выберите ближайшую дату в интервале - PullRequest
0 голосов
/ 17 апреля 2019

Я пытаюсь выбрать строки, в которых 3+ сообщения находятся в интервале 14 дней. Например:

    User    | id_post    | date    
    1       | 12         | 2018-01-01    
    1       | 13         | 2018-01-05    
    1       | 14         | 2018-01-21    
    1       | 15         | 2018-01-27    
    1       | 16         | 2018-01-29    
    2       | 17         | 2018-01-01    
    2       | 18         | 2018-01-20    
    2       | 19         | 2018-02-17    
    2       | 20         | 2018-03-07    
    2       | 21         | 2018-04-29

Пользователь = OwnerUserId

дата = дата создания

В этом случае мне нужно вернуть только пользователя 1, потому что у него есть сообщения, которые находятся в 14 днях.

Пожалуйста, помогите мне, как я могу получить это. Спасибо

Обновление: у пользователя должны быть публикации, опубликованные с интервалом в 14 дней. Это может быть больше, например, если последний день наступил в 2019 году, но в 2018 году было опубликовано 3 сообщения в течение 14 дней - это нормально

теперь у меня есть (данные получаются из data.stackexchange stackoverflow) и попытался применить

select OwnerUserId from Posts  as p
where OwnerUserId in (select Users.id from Users WHERE YEAR (Users.CreationDate) >= 2017) 
AND YEAR (p.CreationDate) >= 2018 
AND p.Tags like '%sql%'
join (select OwnerUserId, CreationDate as startdate, dateadd(day,14,CreationDate) as enddate
from Posts) as r
 on p.OwnerUserId = r.OwnerUserId and p.CreationDate between r.startdate and r.enddate
 group by p.OwnerUserId, CreationDate
having count(*) >= 3

но он отвечает

Incorrect syntax near the keyword 'join'.
 Incorrect syntax near the keyword 'as'.

Я новичок здесь и в SQL, поэтому я точно не знаю, как объединить мой предыдущий 'filterr' и текущее объединение с датой

Ответы [ 4 ]

0 голосов
/ 17 апреля 2019

Во-первых, я думаю, что вы имеете в виду пользователя 1, а не 2.

В MySQL 8+ это довольно просто. Если вы хотите первый такой пост:

select t.*
from (select t.*,
             lead(date, 2) over (partition by user order by date) as next_date2
      from t
     ) t
where next_date2 <= date + interval 14 day;
0 голосов
/ 17 апреля 2019

Я думаю, что-то вроде

select p.user_id
  from posts p
  join (select user_id, xdate start_date, date_add(xdate, interval 14 day) end_date
         from posts) r 
    on p.user_id = r.user_id and p.xdate between r.start_date and r.end_date
 group by user_id, start_date
having count(*) >= 3

может помочь.Возможно, это не лучшее из возможных решений, но оно работает.

Проверьте его на SQL Fiddle

0 голосов
/ 17 апреля 2019

Если вы просто хотите выбрать пользователей по идентификатору, вы можете попробовать

Select id_post, date from yourtable where user = 2 order by id DESC limit 10;

У вас должен быть Colum с идентификатором с автоматическим приращением, чтобы новые сообщения имели более высокий идентификатор, поэтому при сортировке по убыванию они будут начинаться с поста с более высоким идентификатором, а также у вас должен быть индекс для этого идентификатора с автоматическим приращением и индексом

Если вы не хотите использовать вышеописанный метод, вы сделаете это с диапазоном дат, подобным этому

$date = gmdate() - (3600*24);  24 is 24 hours past
Select id_post, title from mutable where add_date > 'value of $date'

В обоих случаях у вас должен быть индекс по идентификатору пользователя Второй запрос - это то, что вам нужно, но сначала вы должны получить дату из уравнения, а затем применить ее к запросу

0 голосов
/ 17 апреля 2019

Я не скажу вам решение, но дам вам некоторый псевдокод, и вы поймете, как его кодировать в SQL-

a) Вы должны ограничить свои данные всего 14 днями.b) Теперь выполните группировку по User и найдите количество имеющихся записей / строк (для каждого User).

c) Теперь снова выполните проверку фильтра, чтобы найти пользователей, чье количество записей равнобольше 3.

Теперь скажите нам, какие ключевые слова SQL будут использоваться для каждой из указанных выше точек.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...