sql—提取在某些平台上处于活动状态的客户id

hts6caw3  于 2021-07-29  发布在  Java
关注(0)|答案(2)|浏览(285)

我想提取以下信息:
不同的 Customer_ids 在a平台和b平台都很活跃
不同的 Customer_ids 在a和b两个平台上都不活跃的客户(即在a和b以外的任何其他平台上活跃的客户)
主表

date          customer_id  platform
2019-01-01    1            A
2019-01-01    1            B
2019-01-01    2            A
2019-01-01    2            B
2019-01-01    3            A
2019-01-01    4            A
2019-01-01    4            B
2019-01-01    5            C
2019-01-01    6            D

输出表1

Date         customerID_active_both_platforms
2019-01-01      1
2019-01-01      2
2019-01-01      4

输出表2

Date         customerID_active_neither_platforms
2019-01-01      5
2019-01-01      6
q43xntqr

q43xntqr1#

您可以使用条件聚合来处理这个问题。对于同时使用a和b平台的客户的第一个要求:

SELECT
    Date,
    customer_id AS customerID_active_both_platforms
FROM yourTable
WHERE
    platform IN ('A', 'B')
GROUP BY
    Date,
    customer_id
HAVING
    MIN(platform) <> MAX(platform);

对于第二个要求,既没有平台a也没有平台b的客户:

SELECT
    Date,
    customer_id AS customerID_active_neither_platforms
FROM yourTable
GROUP BY
    Date,
    customer_id
HAVING
    COUNT(CASE WHEN platform IN ('A', 'B') THEN 1 END) = 0;
pinkon5k

pinkon5k2#

如果希望每个客户都有此信息,请使用两个聚合级别—首先按客户/日期,然后按客户:

select date,
       sum( is_a * is_b ) as num_ab,
       sum( (1 - is_a) * (1 - is-b) ) as num_not_ab
from (select customer, date,
             max(case when platform = 'A' then 1 else 0 end) as is_a,
             max(case when platform = 'B' then 1 else 0 end) as is_b,
             max(case when platform not in ('A', 'B') then 1 else 0 end) as is_not_ab
      from t
      group by customer, date
     ) t
from t
group by date;

当然,你可以用 where 条款以获得只满足一个或另一个条件的客户。

相关问题