你如何将多个群体压缩成一个?

时间:2017-08-09 15:12:11

标签: sql postgresql netezza

我有一个简单的数据集,我想在其中标记在左连接中具有任何匹配行的user_ids,因为他们“曾经”采取行动,并且通过扩展标签标记那些“从不”采取行动的人。

我无法缩小GROUP BY产生的值,以便为每个user_id获取一个值,如果他们“曾经”采取过某种行动。

有关示例数据和查询,请参阅rextester:http://rextester.com/BOVT75663

访问:

| 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

当前输出/查询:

{{1}}

2 个答案:

答案 0 :(得分:1)

从上一个ever_never移除group by

select user_id, min(ever_never) as ever_never, sum(action_count)
from tbl
group by user_id
order by 1

答案 1 :(得分:1)

如果还有MIN,您可以使用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

检查结果:http://rextester.com/live/LQDR42614