Как показать последние даты для каждого пользователя и отфильтровать строки, если дата между предыдущей и последней датой <7 - PullRequest
0 голосов
/ 10 апреля 2020

У меня есть структура таблицы ниже

UserID | Date
1        2020-01-01
1        2020-01-02
1        2020-01-03
1        2020-02-05
1        2020-02-06
1        2020-03-08
1        2020-03-09
2        2020-02-03
2        2020-02-05
2        2020-02-06
3        2020-02-12
3        2020-02-13
3        2020-03-25
3        2020-03-26

Желаемый результат:

UserID | Date
1       2020-03-08
1       2020-03-09
2       2020-02-03
2       2020-02-05
2       2020-02-06
3       2020-03-25
3       2020-03-26

Поэтому мне нужно показывать последние даты для каждого пользователя и скрывать строки, если датированная разница между предыдущей и последней датой < 7

Заранее спасибо за помощь

Ответы [ 2 ]

1 голос
/ 10 апреля 2020

Я понимаю, что вы хотите последние 7 дней данных на пользователя. Если это так, вы можете использовать оконные функции:

select userid, date
from (
    select t.*, max(date) over(partition by userid) max_date
    from mytable t
) t
where datediff(day, date, max_date) <= 7

Демонстрация на DB Fiddle :

userid | date      
:----- | :---------
1      | 2020-03-08
1      | 2020-03-09
2      | 2020-02-03
2      | 2020-02-05
2      | 2020-02-06
3      | 2020-03-25
3      | 2020-03-26
0 голосов
/ 10 апреля 2020

Я могу подумать об использовании двух операторов предложения With, как указано ниже.

С Date1 как (выберите идентификатор пользователя, дату от (выберите userif, date, rank () более (разделить по порядку идентификатора пользователя по дате des c) как rnk из таблицы) A, где A.rnk = 1)

С Date2 как (выберите ID пользователя, дату от (выберите ID пользователя, дату, rank () за (разделить по порядку ID пользователя по дате des c) как rnk из таблицы) B, где B.rnk = 2 )

выберите date1.userid, date1.date от date1 присоединиться к date2 на date1.userid = date2.userid где DATEDIFF (date1.date, date2.date) <7 </p>

...