Как выбрать клиентов, где их первые три заказа соответствуют определенным значениям? - PullRequest
0 голосов
/ 20 марта 2019

Скажем, у меня есть таблица shop_orders, и я хочу посмотреть все customer_id, где их первые 3 order_type - это "Book", "Coffee" и "Pen" в этом порядке.

Исходная таблица будет выглядеть так:

customer_id  order_type  order_time
6872         Coffee      2018-04-06 15:06
6455         Book        2018-04-06 15:08
6872         Coffee      2018-04-06 19:12
6455         Coffee      2018-04-07 15:08
5217         Pen         2018-04-08 09:11
5217         Book        2018-04-08 10:55
6455         Pen         2018-04-09 05:22
6455         Coffee      2018-04-09 07:46

Поскольку первые три заказа пользователя 6455 - это «Книга», «Кофе» и «Ручка», запрос должен вернуть:

customer_id
6455

Я использую BigQuery для этого.

Ответы [ 3 ]

1 голос
/ 20 марта 2019

Ниже для BigQuery Standard SQL

#standardSQL
SELECT customer_id
FROM `project.dataset.shop_orders`
GROUP BY customer_id
HAVING STRING_AGG(order_type ORDER BY order_time LIMIT 3) = 'Book,Coffee,Pen'  

Вы можете протестировать, поиграть с выше, используя примеры данных из вашего вопроса, как в примере ниже

#standardSQL
WITH `project.dataset.shop_orders` AS (
  SELECT 6872 customer_id, 'Coffee' order_type, '2018-04-06 15:06' order_time UNION ALL
  SELECT 6455, 'Book', '2018-04-06 15:08' UNION ALL
  SELECT 6872, 'Coffee', '2018-04-06 19:12' UNION ALL
  SELECT 6455, 'Coffee', '2018-04-07 15:08' UNION ALL
  SELECT 5217, 'Pen', '2018-04-08 09:11' UNION ALL
  SELECT 5217, 'Book', '2018-04-08 10:55' UNION ALL
  SELECT 6455, 'Pen', '2018-04-09 05:22' UNION ALL
  SELECT 6455, 'Coffee', '2018-04-09 07:46'
)
SELECT customer_id
FROM `project.dataset.shop_orders`
GROUP BY customer_id
HAVING STRING_AGG(order_type ORDER BY order_time LIMIT 3) = 'Book,Coffee,Pen' 

с результатом

Row customer_id  
1   6455     
0 голосов
/ 20 марта 2019

вы можете попробовать, как показано ниже, используя exists и row_number()

  with cte as
 (
  select *,row_number()over(partition by customer_id order by order_time ) rn
  from table    
 ), cte1 as
 (
  select * from cte where rn<=3
 ) select * from cte1 t1
   where exists( select 1 from cte1 t2 where t1.customer_id=t2.customer_id
                and t2.rn=1 and t2.order_type='Book'
                )
              and exists ( select 1 from cte1 t2
              where t1.customer_id=t2.customer_id
                and t2.rn=2 and t2.order_type='Coffee'
                )
               and exists ( select 1 from cte1 t2
              where t1.customer_id=t2.customer_id
                and t2.rn=3 and t2.order_type='Pen'

            )

output

customer_id     order_type  order_time  rn
6455    Book    2018-04-06 15:08        1
6455    Coffee  2018-04-07 15:08        2
6455    Pen     2018-04-09 05:22        3

демо на сервере sql, но также будет работать bigquery

0 голосов
/ 20 марта 2019

Хммм. , ,

select customer_id
from t
group by customer_id
having array_to_string(array_agg(order_type order by order_time limit 3), ',') = 'Book,Coffee,Pen';

Вот код:

with t as (
      select 6872 as customer_id, 'Coffee' as order_type, '2018-04-06 15:06' as order_time union all
      select 6455, 'Book', '2018-04-06 15:08' union all
      select 6872, 'Coffee', '2018-04-06 19:12' union all
      select 6455, 'Coffee', '2018-04-07 15:08' union all
      select 5217, 'Pen', '2018-04-08 09:11' union all
      select 5217, 'Book', '2018-04-08 10:55' union all
      select 6455, 'Pen', '2018-04-09 05:22' union all
      select 6455, 'Coffee', '2018-04-09 07:46'
     )
select customer_id, array_to_string(array_agg(order_type order by order_time limit 3), ',')
from t
group by customer_id
having array_to_string(array_agg(order_type order by order_time limit 3), ',') = 'Book,Coffee,Pen';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...