你如何将多个组压缩成一个?
How do you condense multiple groups into one?
我有一个简单的数据集,我想将其标记为 user_ids 在左联接中具有任何匹配行的人已 'ever' 采取了操作,并通过扩展标记那些具有 'never' 采取了行动。
如果他们 'ever' 采取了行动,我无法压缩 GROUP BY 产生的值以获得每个 user_id 的单个值。
示例数据和查询见 rextester:http://rextester.com/BOVT75663
访问次数:
| loc_id | user_id | site_visit_date | site_visit_count |
|--------|---------|-----------------|------------------|
| 1234 | 003 | 06/05/2016 | 1 |
| 1234 | 003 | 06/06/2016 | 1 |
| 1234 | 003 | 06/09/2016 | 1 |
| 1234 | 802 | 05/18/2016 | 1 |
| 1234 | 818 | 02/19/2016 | 1 |
| 1234 | 818 | 02/21/2016 | 1 |
...and so on
动作:
| loc_id | user_id | action_date | action_category | action_count |
|--------|---------|-------------|-----------------|--------------|
| 1234 | 003 | 06/05/2016 | action123 | 2 |
| 1234 | 003 | 06/14/2016 | action123 | 5 |
| 1234 | 003 | 07/01/2016 | action123 | 1 |
| 1234 | 868 | 02/29/2016 | action123 | 13 |
| 1234 | 868 | 03/17/2016 | action123 | 9 |
| 1234 | 877 | 02/08/2016 | action123 | 5 |
| 1234 | 877 | 03/25/2016 | action123 | 4 |
期望输出:
| user_id | ever_never | sum |
|---------|------------|------|
| 3 | ever | 7 |
| 802 | never | NULL |
| 818 | never | NULL |
| 868 | ever | 22 |
| 871 | never | NULL |
| 876 | never | NULL |
| 877 | ever | 9 |
当前输出/查询:
| user_id | ever_never | sum |
|---------|------------|------|
| 3 | ever | 7 |
| 3 | never | NULL |
| 802 | never | NULL |
| 818 | never | NULL |
| 868 | ever | 22 |
| 868 | never | NULL |
| 871 | never | NULL |
| 876 | never | NULL |
| 877 | ever | 9 |
| 877 | never | NULL |
with tbl as (
select
v.loc_id
,v.user_id
,TO_CHAR(v.site_visit_date,'YYYY-MM-DD')
,v.site_visit_count
,TO_CHAR(a.action_date,'YYYY-MM-DD')
,a.action_category
,a.action_count
,case when a.action_count >=1 then 'ever' else 'never' end ever_never
from
visits v
left join actions a on v.user_id = a.user_id and v.site_visit_date = a.action_date
order by 1,2,5
)
select
user_id
,ever_never
,sum(action_count)
from
tbl
group by
user_id
,ever_never
order by 1,2
从最后一个 group by
中删除 ever_never
:
select user_id, min(ever_never) as ever_never, sum(action_count)
from tbl
group by user_id
order by 1
你可以使用MIN
函数来select ever
,当还有一个never
:
with tbl as (
select
v.loc_id
,v.user_id
,TO_CHAR(v.site_visit_date,'YYYY-MM-DD')
,v.site_visit_count
,TO_CHAR(a.action_date,'YYYY-MM-DD')
,a.action_category
,a.action_count
,case when a.action_count >=1 then 'ever' else 'never' end ever_never
from
visits v
left join actions a on v.user_id = a.user_id and v.site_visit_date = a.action_date
order by 1,2,5
)
select
user_id
,MIN(ever_never)
,sum(action_count)
from
tbl
group by
user_id
order by 1,2
我有一个简单的数据集,我想将其标记为 user_ids 在左联接中具有任何匹配行的人已 'ever' 采取了操作,并通过扩展标记那些具有 'never' 采取了行动。
如果他们 'ever' 采取了行动,我无法压缩 GROUP BY 产生的值以获得每个 user_id 的单个值。
示例数据和查询见 rextester:http://rextester.com/BOVT75663
访问次数:
| loc_id | user_id | site_visit_date | site_visit_count |
|--------|---------|-----------------|------------------|
| 1234 | 003 | 06/05/2016 | 1 |
| 1234 | 003 | 06/06/2016 | 1 |
| 1234 | 003 | 06/09/2016 | 1 |
| 1234 | 802 | 05/18/2016 | 1 |
| 1234 | 818 | 02/19/2016 | 1 |
| 1234 | 818 | 02/21/2016 | 1 |
...and so on
动作:
| loc_id | user_id | action_date | action_category | action_count |
|--------|---------|-------------|-----------------|--------------|
| 1234 | 003 | 06/05/2016 | action123 | 2 |
| 1234 | 003 | 06/14/2016 | action123 | 5 |
| 1234 | 003 | 07/01/2016 | action123 | 1 |
| 1234 | 868 | 02/29/2016 | action123 | 13 |
| 1234 | 868 | 03/17/2016 | action123 | 9 |
| 1234 | 877 | 02/08/2016 | action123 | 5 |
| 1234 | 877 | 03/25/2016 | action123 | 4 |
期望输出:
| user_id | ever_never | sum |
|---------|------------|------|
| 3 | ever | 7 |
| 802 | never | NULL |
| 818 | never | NULL |
| 868 | ever | 22 |
| 871 | never | NULL |
| 876 | never | NULL |
| 877 | ever | 9 |
当前输出/查询:
| user_id | ever_never | sum |
|---------|------------|------|
| 3 | ever | 7 |
| 3 | never | NULL |
| 802 | never | NULL |
| 818 | never | NULL |
| 868 | ever | 22 |
| 868 | never | NULL |
| 871 | never | NULL |
| 876 | never | NULL |
| 877 | ever | 9 |
| 877 | never | NULL |
with tbl as (
select
v.loc_id
,v.user_id
,TO_CHAR(v.site_visit_date,'YYYY-MM-DD')
,v.site_visit_count
,TO_CHAR(a.action_date,'YYYY-MM-DD')
,a.action_category
,a.action_count
,case when a.action_count >=1 then 'ever' else 'never' end ever_never
from
visits v
left join actions a on v.user_id = a.user_id and v.site_visit_date = a.action_date
order by 1,2,5
)
select
user_id
,ever_never
,sum(action_count)
from
tbl
group by
user_id
,ever_never
order by 1,2
从最后一个 group by
中删除 ever_never
:
select user_id, min(ever_never) as ever_never, sum(action_count)
from tbl
group by user_id
order by 1
你可以使用MIN
函数来select ever
,当还有一个never
:
with tbl as (
select
v.loc_id
,v.user_id
,TO_CHAR(v.site_visit_date,'YYYY-MM-DD')
,v.site_visit_count
,TO_CHAR(a.action_date,'YYYY-MM-DD')
,a.action_category
,a.action_count
,case when a.action_count >=1 then 'ever' else 'never' end ever_never
from
visits v
left join actions a on v.user_id = a.user_id and v.site_visit_date = a.action_date
order by 1,2,5
)
select
user_id
,MIN(ever_never)
,sum(action_count)
from
tbl
group by
user_id
order by 1,2