Ниже для 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