只是为了好玩,另一种基于递归子查询分解和多集运算符的解决方案(不用于生产,因为性能慢):
with tablename(SUBMISSION_DATE , SUBMISSION_ID, USER_ID, USER_NAME) as (
select to_date('01-Mar-2016','dd-mon-yyyy'), 8494, 20703, 'Angela' from dual union all
select to_date('01-Mar-2016','dd-mon-yyyy'), 30173, 36396, 'Frank' from dual union all
select to_date('01-Mar-2016','dd-mon-yyyy'), 22403, 53473, 'Kimberly' from dual union all
select to_date('01-Mar-2016','dd-mon-yyyy'), 23965, 79722, 'Michael' from dual union all
select to_date('02-Mar-2016','dd-mon-yyyy'), 38740, 15758, 'Rose' from dual union all
select to_date('02-Mar-2016','dd-mon-yyyy'), 34928, 20703, 'Angela' from dual union all
select to_date('02-Mar-2016','dd-mon-yyyy'), 42769, 79722, 'Michael' from dual union all
select to_date('02-Mar-2016','dd-mon-yyyy'), 44364, 79722, 'Michael' from dual union all
select to_date('03-Mar-2016','dd-mon-yyyy'), 45440, 20703, 'Angela' from dual union all
select to_date('03-Mar-2016','dd-mon-yyyy'), 49050, 36396, 'Frank' from dual union all
select to_date('03-Mar-2016','dd-mon-yyyy'), 50273, 79722, 'Michael' from dual union all
select to_date('04-Mar-2016','dd-mon-yyyy'), 50344, 20703, 'Angela' from dual union all
select to_date('04-Mar-2016','dd-mon-yyyy'), 51360, 44065, 'Lisa' from dual union all
select to_date('04-Mar-2016','dd-mon-yyyy'), 54404, 53473, 'Kimberly' from dual union all
select to_date('04-Mar-2016','dd-mon-yyyy'), 61533, 79722, 'Michael' from dual union all
select to_date('05-Mar-2016','dd-mon-yyyy'), 72852, 20703, 'Angela' from dual union all
select to_date('05-Mar-2016','dd-mon-yyyy'), 82439, 36396, 'Frank' from dual union all
select to_date('05-Mar-2016','dd-mon-yyyy'), 9006, 36396, 'Frank' from dual union all
select to_date('05-Mar-2016','dd-mon-yyyy'), 74546, 38289, 'Patrick' from dual union all
select to_date('05-Mar-2016','dd-mon-yyyy'), 76487, 62529, 'Bonnie' from dual union all
select to_date('06-Mar-2016','dd-mon-yyyy'), 90404, 20703, 'Angela' from dual
)
,agg as (
select SUBMISSION_DATE
, cast(collect(distinct USER_NAME) as sys.ku$_vcnt) users
, row_number()over(order by SUBMISSION_DATE) n
from tablename
group by SUBMISSION_DATE
)
,cte(sdate,users) as (
select SUBMISSION_DATE
, users
from agg
where n=1
union all
select SUBMISSION_DATE
, cte.users multiset intersect agg.users users
from cte, agg
where sdate + 1 = SUBMISSION_DATE
)
select
sdate,
cardinality(users) cnt,
users
from cte;
结果:
SDATE CNT USERS
------------------- ---------- ----------------------------------------------------------------------------------------------------
2016-03-01 00:00:00 4 KU$_VCNT('Angela', 'Frank', 'Kimberly', 'Michael')
2016-03-02 00:00:00 2 KU$_VCNT('Angela', 'Michael')
2016-03-03 00:00:00 2 KU$_VCNT('Angela', 'Michael')
2016-03-04 00:00:00 2 KU$_VCNT('Angela', 'Michael')
2016-03-05 00:00:00 1 KU$_VCNT('Angela')
2016-03-06 00:00:00 1 KU$_VCNT('Angela')