我想计算独有的用户,这些用户只拥有Bucket A,Bucket B或Bucket A和B.我的表看起来像这样:
DateKey User Bucket
05-18 1 A
05-18 1 B
05-18 2 B
05-18 3 A
05-18 4 A
05-18 4 A
04-18 1 A
04-18 1 B
04-18 2 B
04-18 3 A
04-18 4 A
04-18 4 A
在此处获取结构http://sqlfiddle.com/#!18/45a36/1
我想要的结果就是这样:
DateKey Bucket UniqueUsers
05-18 A 2
B 1
A+B 1
04-18 A 2
B 1
A+B 1
感谢您的帮助。
答案 0 :(得分:0)
请参阅:http://sqlfiddle.com/#!18/45a36/11
select DateKey
, max(case
when IsA = 1 and IsB = 0 then 'A'
when IsA = 0 and IsB = 1 then 'B'
when IsA = 1 and IsB = 1 then 'A+B'
end) Bucket
, count(distinct [User]) UniqueUsers
from
(
select DateKey
, [User]
, max(case when bucket = 'A' then 1 else 0 end) IsA
, max(case when bucket = 'B' then 1 else 0 end) IsB
from table1
group by DateKey, [User]
) x
group by DateKey, IsA, IsB
order by DateKey, IsA + (IsB * 2)
我们的子查询将每个用户/日期键压缩到一行,并用列表示是否有A和/或B的值。
然后,我们可以按DateKey
,IsA
和IsB
对这些行进行分组,将每个DateKey
值和IsA
的每个组合压缩为1行和IsB
(1, 0
,0, 1
和1, 1
; 0, 0
不存在,因为这将要求table1
中没有行,这样就不会产生结果。
最后,我们计算每个组中不同用户的数量。
注意:订单只是获取A, B, A+B
...即我已经做到(1,0)
= 1,(0,1)
= 2,{{1} } = 3.
答案 1 :(得分:0)
如果你只有两个桶,我会这样做:
select DateKey, buckets, count(*) as UniqueUsers
from (select DateKey, [User],
(case when min(bucket) <> max(bucket)
then min(bucket) + '+' + max(bucket)
else min(bucket)
end) as buckets
from table1 t
group by DateKey, [User]
) t
group by DateKey, buckets
order by DateKey, len(buckets), buckets;
Here是SQL小提琴。