Необходимо выбрать все типы подписки для всех идентификаторов клиентов, если идентификатор клиента включает 7-дневную пробную версию - PullRequest
0 голосов
/ 08 мая 2020

У меня есть оператор basi c select, который показывает клиентов, у которых есть семидневные бесплатные пробные версии:

select customer_id from purchases where description = '7 Day Free Trial'

Этот же идентификатор клиента может также иметь дополнительные описания в покупках, указывающие, что они купили подписку для в месяц, 6 месяцев, один год, а также другие варианты.

Если для customer_id есть description = '7 Day Free Trial', то мне нужно выбрать все строки для этих идентификаторов клиентов. Я хочу, чтобы эти строки не считали их.

Я знаю, как найти строки, в которых customer_id находится в таблице покупок более одного раза, с помощью этого запроса

SELECT *
FROM purchases WHERE customer_id IN
(
SELECT customer_id
FROM purchases
GROUP BY customer_id
HAVING COUNT(*) > 1)
ORDER BY customer_id ASC

, который дает:

customer_id status   description
12321       credit   7 Day Free Trial
12321       paid     1 Month Paid Subscription
78651       credit   6 Month Paid Subscription
78651       refund   6 Month Paid Subscription
45234       paid     30 Day Free Trial
45234       credit   1 Year Paid Description

Но я изо всех сил пытаюсь понять, как подойти к проблеме, где, если у клиента _id есть description = '7 Day Free Trial', выбрать все строки для этого идентификатора клиента.

Пример желаемого результата:

customer_id     description
12321       7 Day Free Trial 
12321       1 Month Paid Subscription
78651       7 Day Free Trial 
78651       1 Year Paid Description 
45234       7 Day Free Trial            
45234       6 Month Paid Subscription

Любые предложения приветствуются. Я просто не знаю, как к этому подойти.

Ответы [ 2 ]

1 голос
/ 08 мая 2020

Один метод использует оконные функции:

select p.*
from (select p.*, count(*) over (partition by customer_id) as cnt,
             sum( (p2.description = '7 Day Free Trial')::int ) over (partition by customer_id) as num_free_trials
      from purchases p
     ) p
where cnt >= 2 and num_free_trials > 0;

Однако, если вам нужны просто описания, может быть достаточно поместить их в одну строку - с использованием агрегирования:

select customer_id, array_agg(description) as descriptions
from purchases p
group by customer_id
having count(*) filter (where p2.description = '7 Day Free Trial') > 0;

Это позволяет вам использовать distinct для получения только уникальных описаний, если хотите.

В Redshift (тег был изменен после того, как я ответил), вы можете использовать:

having sum( (p2.description = '7 Day Free Trial')::int ) > 0
0 голосов
/ 08 мая 2020

Я разобрался. Я получаю результаты, которые искал, в конце своего сообщения следующим образом:

SELECT 
    customer_id, 
    id, 
    description 
FROM 
    firecracker.productionrr_purchases
WHERE 
    customer_id IN  (
        SELECT 
            customer_id 
        FROM            (
            SELECT  
                customer_id, 
                count(*) AS trial_user_rec
            FROM    
                firecracker.productionrr_purchases
            WHERE   
                customer_id IN  (
                    SELECT
                        customer_id 
                    FROM 
                        firecracker.productionrr_purchases
                    WHERE 
                        lower(description) LIKE lower('7 Day Free Trial')
                                )
            GROUP BY customer_id
                        )
    WHERE trial_user_rec>1
                    )
ORDER BY customer_id DESC

, который возвращает

customer_id     description
12321       7 Day Free Trial 
12321       1 Month Paid Subscription
78651       7 Day Free Trial 
78651       1 Year Paid Description 
45234       7 Day Free Trial            
45234       6 Month Paid Subscription
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...