您的特定应用使这很简单,我认为。如果在'n'天的时间间隔内有'n'个不同的日期,那么'n'个不同的日期必须是才是连续的。
滚动到底部寻找只需要通用表格表达式并转换为PostgreSQL的通用解决方案。 (开玩笑,我在PostgreSQL中实现,因为我时间不够)。
create table ForumPost (
ID integer primary key,
UserID integer not null,
post_date date not null
);
insert into forumpost values
(1, 1, '2013-01-15'),
(2, 1, '2013-01-16'),
(3, 1, '2013-01-17'),
(4, 1, '2013-01-18'),
(5, 1, '2013-01-19'),
(6, 1, '2013-01-20'),
(7, 1, '2013-01-21'),
(11, 2, '2013-01-15'),
(12, 2, '2013-01-16'),
(13, 2, '2013-01-17'),
(16, 2, '2013-01-17'),
(14, 2, '2013-01-18'),
(15, 2, '2013-01-19'),
(21, 3, '2013-01-17'),
(22, 3, '2013-01-17'),
(23, 3, '2013-01-17'),
(24, 3, '2013-01-17'),
(25, 3, '2013-01-17'),
(26, 3, '2013-01-17'),
(27, 3, '2013-01-17');
现在,让我们看看这个查询的输出。为简洁起见,我正在查看5天的时间间隔,而不是30天的时间间隔。
select userid, count(distinct post_date) distinct_dates
from forumpost
where post_date between '2013-01-15' and '2013-01-19'
group by userid;
USERID DISTINCT_DATES
1 5
2 5
3 1
对于符合条件的用户,该5天间隔内不同日期的数量必须为5,对不对?所以我们只需要将该逻辑添加到HAVING子句中。
select userid, count(distinct post_date) distinct_dates
from forumpost
where post_date between '2013-01-15' and '2013-01-19'
group by userid
having count(distinct post_date) = 5;
USERID DISTINCT_DATES
1 5
2 5
一个更通用的解决方案
它并没有真正意义地说,如果从2013-01-01每天发布到2013年1月31日,你已连续30天发布2次。相反,我希望时间在2013-01-31重新开始。我在PostgreSQL中实现道歉;我会稍后尝试在T-SQL中实现。
with first_posts as (
select userid, min(post_date) first_post_date
from forumpost
group by userid
),
period_intervals as (
select userid, first_post_date period_start,
(first_post_date + interval '4' day)::date period_end
from first_posts
), user_specific_intervals as (
select
userid,
(period_start + (n || ' days')::interval)::date as period_start,
(period_end + (n || ' days')::interval)::date as period_end
from period_intervals, generate_series(0, 30, 5) n
)
select userid, period_start, period_end,
(select count(distinct post_date)
from forumpost
where forumpost.post_date between period_start and period_end
and userid = forumpost.userid) distinct_dates
from user_specific_intervals
order by userid, period_start;
您正在使用哪些DBMS? Postgres的?甲骨文? –
SQL Server 2008 r2 –
使用子查询处理日期范围为30天前的所有帖子,按日期和次数分组..检查是否30? –