Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何将多个组压缩为一个组?_Sql_Postgresql_Netezza - Fatal编程技术网

Sql 如何将多个组压缩为一个组?

Sql 如何将多个组压缩为一个组?,sql,postgresql,netezza,Sql,Postgresql,Netezza,我有一个简单的数据集,我想将左连接中有任何匹配行的用户ID标记为“曾经”执行过操作,并通过扩展将那些“从未”执行过操作的用户ID标记为“从未” 如果每个用户“曾经”采取过某项操作,我很难将GROUP BY生成的值压缩为每个用户id的一个值 有关样本数据和查询,请参见rextester: 访问: | loc_id | user_id | site_visit_date | site_visit_count | |--------|---------|-----------------|------

我有一个简单的数据集,我想将左连接中有任何匹配行的用户ID标记为“曾经”执行过操作,并通过扩展将那些“从未”执行过操作的用户ID标记为“从未”

如果每个用户“曾经”采取过某项操作,我很难将GROUP BY生成的值压缩为每个用户id的一个值

有关样本数据和查询,请参见rextester:

访问:

| 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
行动:

| 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
所需输出:

| 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
当前输出/查询:

| 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

从最后一个
分组中删除
ever\u never

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

从最后一个
分组中删除
ever\u never

select user_id, min(ever_never) as ever_never, sum(action_count)
from tbl
group by user_id
order by 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

检查结果:

当还有一个
从不
时,您可以使用
MIN
功能选择
ever

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

检查结果:

这给了我一个“从不”的用户ID,根据他们在左连接中的匹配情况,这个ID应该是“曾经”。如果我能澄清这篇文章,请让我知道。这是给我一个“从不”的用户ID,应该是一个“曾经”的基础上,他们在左加入匹配。如果我能澄清这篇文章,请让我知道。通过使用聚合函数选择所需组的最小/最大值,这两个答案就足够了。我现在看到,根据所需的“ever/never”状态标记成员的更有效方法是1/0,以确保min/max产生所需的数值结果,而不是字符串。通过使用聚合函数选择所需的组的min/max,这两个答案都足够了。我现在看到,根据所需的“ever/never”状态标记成员的更有效方法是1/0,以确保min/max产生所需的数值结果,而不是字符串。